2016-12-28 7 views
0

私は、アプリケーションを起動する前に、非同期操作(たとえば、URL呼び出しが完了するのを待つ)を実行します。私はそれを行う方法がわかりません(それは上位アプリケーションなので非同期/ここで待っています)。express.jsが始まる前に非同期関数を実行する

www.js:

var app = require('./app'); 
var http = require('http'); 
const port = '3000'; 
app.set('port', port); 
var server = http.createServer(app); 
server.listen(port); 

app.js:

var express = require('express'); 
var app = express(); 
var Promise = require('bluebird'); 

# HERE IS WHERE I WANT TO "AWAIT" AN ASYNCHRONOUS CALL. 
# I KNOW I CAN'T USE AWAIT BECAUSE I'M NOT WITHIN 
# AN "ASYNC" ANNOTATED FUNCTION. EXAMPLE: 
const data = await Promise.promisify(fs.readFile('DATA')); 

app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use('/', routes); 
module.exports = app; 

私はPromise.promisify(とapp.jsのすべてを包む考えた)ので、私はそれをwithing待つ非同期使用することができます。しかし、私はそれが呼び出されていないので、それはapp()のように、www.jsに処理されるかどうかはわかりませんが、あなたが言ったものからhttp.createServer

+0

約束のチュートリアルを参照しましたか?ここでは良いスタートです:https://github.com/kriskowal/q –

+0

*何*非同期呼び出し?また、 'app.js'はエクスポートを表示しませんが、それを持っているかのように使用しています。 –

+0

@ T.J.Crowderあなたが正しいです。私の悪い。エクスポートを追加してファイルを読み込むように編集しました(同期バージョンがあることを知っていますが、そうでないと仮定しましょう。または他の約束された呼び出しを使用しています) – eran

答えて

4

に渡され、app.jsはおそらく何か(おそらくapp?)を輸出しているが、非同期呼び出し(私はあなたが示しているとは思わない)が完了するまで、何かを使用する準備ができていないことを示します。

これがすべて真であるとすれば、どのようなapp.jsのエクスポートは、それを使用して準備が整うまで待つための方法を提供する必要があります。そうするための1つの方法は、約束をすることです。

そして、あなたが約束-ifiedれていないのを待っているものと仮定:

app.js

その後、
var express = require('express'); 
var app = express(); 
exports.appPromise = new Promise(function(resolve, reject) { 
    startTheAsyncOperation(function(err, result) { 
     if (err) { 
      reject(err); 
      return; 
     } 
     app.set('views', path.join(__dirname, 'views')); 
     app.set('view engine', 'jade'); 
     app.use(express.static(path.join(__dirname, 'public'))); 
     app.use('/', routes); 
     resolve(app); 
    }); 
}); 

www.jsに:もちろん

var appPromise = require('./app'); 
var http = require('http'); 
const port = '3000'; 
appPromise.then(function(app) { 
    app.set('port', port); 
    var server = http.createServer(app); 
    server.listen(port); 
}); 

、あなたが待っている非同期のものがあなたに約束を与えるなら、あなたは必要ありませんnew Promiseapp.js;代わりに:

var express = require('express'); 
var app = express(); 
exports.appPromise = startTheAsyncOperation().then(function() { 
    app.set('views', path.join(__dirname, 'views')); 
    app.set('view engine', 'jade'); 
    app.use(express.static(path.join(__dirname, 'public'))); 
    app.use('/', routes); 
    return app; 
}); 
1

非同期パッケージをご覧ください。あなたのニーズに合わせて、非同期パッケージで提供されているウォーターフォールのコントロールフローを実行する必要があります。 You cann have a look as it is very well documented.

コードをウォーターフォール関数でラップすると、コードのこの部分が同期して実行されます。

関連する問題