考虑一个示例:我有以下 express.js
应用程序(请参见下面的代码片段)。我希望在整个应用程序生命周期内与数据库建立一个持久连接,并与我自己的服务建立一个持久连接(这需要异步调用才能启动)。还有一些入口点,即不仅可以通过 HTTP 协议(protocol)访问我的应用程序。当然,我想避免服务初始化代码重复,可能会有多个这样的异步初始化服务。
/* app.js */
var app = require('express')();
// set views, use routes, etc.
var db = require('monk/mongoose/etc')(...); // happily, usually it's a sync operation
var myService = require('./myService'); // however, it's possible to have several such services
myService.init(function(err, result) {
// only here an initialization process is finished!
});
module.exports.app = app;
/* http_server.js (www entry point) */
var app = require('app');
// create an HTTP server with this app and start listening
/* telnet_server.js (other entry point) */
var app = require('app');
// create a Telnet server with this app and start listening
在上面的代码片段中,当 http(或 telnet,或任何其他)服务器启动时,无法保证 myService
已经初始化。
因此,我必须以某种方式重新组织我的应用程序创建代码。现在我坚持使用下一个解决方案:
/* app.js */
var app = require('express')();
module.exports.app = app;
module.exports.init = function(callback) {
var myService = require('./myService');
myService.init(callback);
}
/* entry_point.js */
var app = require('app');
app.init(function(err) {
if (!err) {
// create an HTTP/Telnet/etc server and start listening
}
});
那么,我的问题是:初始化需要异步调用启动的服务的常用方法是什么?
最佳答案
我会建议你 promise 你的服务的初始化功能,然后按以下方式使用它们:
const app = require('express')();
const util = require('util');
const myService = require('./myService');
const myServiceInit = util.promisify(myService.init);
Promise.all([myServiceInit]).then(() => {
// delayed listening of your app
app.listen(2000);
}).catch(err => {
// handle error here
});
我使用 Promise.all 来让您添加多个内部服务的初始化。
promise 初始化函数的先决条件是它应该使用错误优先回调机制。您可以在这里阅读更多相关信息 Node Official Doc
希望这对您的事业有所帮助。
关于javascript - express.js(或类似)应用程序的异步初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34660414/