【发布时间】:2016-04-12 03:41:59
【问题描述】:
考虑一个例子:我有以下express.js 应用程序(参见下面的代码 sn-p)。我想在整个应用程序生命周期内拥有一个与数据库的持久连接,以及一个与我自己的服务(需要异步调用才能启动)的持久连接。并且有几个入口点,即一个人不仅可以通过 HTTP 协议访问我的应用程序。当然,我想避免服务初始化代码重复,可能会有几个这样的异步初始化服务。
/* 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
在上面的代码 sn-p 中,当 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
}
});
那么,我的问题是:初始化服务需要异步调用启动的常用方法是什么?
【问题讨论】:
-
这与序列化任何异步操作集的方式确实没有什么不同。如果您希望它们按特定顺序完成,则链接承诺或在第一个异步操作的完成回调中执行第二个操作。如果你有 N 个独立的异步操作应该在你做其他事情之前完成,那么使用 Promise 和
Promise.all()。启动服务器与多个异步操作的任何其他协调没有什么不同。
标签: javascript node.js asynchronous express web-frameworks