Javascript 在express.js启动之前运行异步函数

Javascript 在express.js启动之前运行异步函数,javascript,node.js,express,promise,async-await,Javascript,Node.js,Express,Promise,Async Await,我想在启动我的应用程序之前运行一个异步操作(例如,等待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 exp

我想在启动我的应用程序之前运行一个异步操作(例如,等待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;

我想用promisify()包装所有的
app.js
,这样我就可以使用async wait了。但我不确定在
www.js
中会如何处理,因为它没有被调用,就像在
app()
中一样,而是被传递到
http.createServer

从您所说的,
app.js
可能正在导出某些东西(可能是
app
?),但在异步调用之前,这些东西还没有准备好使用(我想你没有展示)是完整的

假设这都是真的,那么
app.js
exports需要为使用它的东西提供一种等待它准备好的方法。一种方法是使用承诺

假设你等待的不是承诺,那么:

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);
    });
});
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);
});
然后在
www.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);
    });
});
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);
});

当然,如果您正在等待的异步东西为您提供了承诺,那么您不需要在
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;
});

看看异步包。根据您的需要,您应该使用异步包提供的瀑布控制流


你可以用瀑布函数包装你的代码,这部分代码将同步运行。

你有没有查阅有关承诺的教程?这是一个好的开始:什么异步调用?另外,
app.js
没有显示任何导出,但你使用它时却好像它有导出一样。@t.J.Crowder你是对的。我的错。编辑为添加exp演示如何读取文件(我知道有一个同步版本。假设没有,或者我正在使用其他承诺的调用)