era*_*ran 5 javascript node.js promise express 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);
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
我想app.js用Promise.promisify()包装所有内容,所以我可以使用异步等待它.但是我不确定如何处理www.js它,因为它没有被调用,因为它被app()传递给了http.createServer
从你所说的,app.js可能是出口的东西(也许是app?)但是在异步调用(我认为你没有显示)完成之前,还没有准备好使用某些东西.
假设这一切都是正确的,那么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);
});
});
Run Code Online (Sandbox Code Playgroud)
然后在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);
});
Run Code Online (Sandbox Code Playgroud)
当然,如果你等待的异步事物向你提出了承诺,你就不需要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;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3404 次 |
| 最近记录: |