2016-12-28 2 views
0

Я хочу запустить операцию async (например, дождаться завершения вызова URL), прежде чем запускать приложение. Я не знаю, как это сделать (поскольку это приложение верхнего уровня - нет async/await здесь).Запуск функции async перед началом 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; 

Я думал о оборачивать все app.js с Promise.promisify(), так что я могу использовать асинхронной Await жгутов его. Но я не уверен, как это будет обработано в www.js, так как он не вызывается, как в app(), но перешел к http.createServer

+0

Вы искали учебники по обещаниям? Вот хороший старт: https://github.com/kriskowal/q –

+0

* Что * асинхронный вызов? Кроме того, 'app.js' не показывает экспорта, и все же вы используете его, как если бы он был. –

+0

@ T.J.Crowder вы правы. Виноват. Отредактировано, чтобы добавить экспорт и проиллюстрировать чтение файла (я знаю, что есть версия синхронизации. Предположим, что нет или я использую какой-либо другой вызов Promised) – eran

ответ

4

Из того, что вы сказали, 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); 
    }); 
}); 

затем в 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 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

Взгляните на пакет асинхронных программ. Для ваших нужд вы должны пойти с потоком контроля водопада, предоставляемым асинхронным пакетом. You cann have a look as it is very well documented.

Вы можете обернуть свой код функцией водопада, и эта часть вашего кода будет работать синхронно.

Смежные вопросы