我想在启动应用程序之前运行异步操作(例如,等待URL调用完成)。我不知道该怎么做(因为它是一个上层应用程序 - 没有异步/等待这里)。
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
,以便我可以使用异步等待它。但我不确定如何在www.js
中处理,因为它未被调用,如app()
,但传递给http.createServer
答案 0 :(得分:7)
根据你所说的,app.js
可能是出口的东西(也许是app
?)但是在异步通话之前还没有准备好使用它(我不喜欢#39;认为你已经完成了)。
假设这一切都是正确的,那么app.js
出口需要为使用它的东西提供一种方法,等待它准备就绪。一种方法是使用承诺。
假设你等待的不是承诺,那么:
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').appPromise;
var http = require('http');
const port = '3000';
appPromise.then(function(app) {
app.set('port', port);
var server = http.createServer(app);
server.listen(port);
});
当然,如果您等待的异步内容为您提供了承诺,那么new Promise
中您不需要app.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 :(得分:0)
看看异步包。根据您的需要,您应该使用async包提供的瀑布控制流程。 You cann have a look as it is very well documented.
您可以使用瀑布函数包装代码,这部分代码将同步运行。