我正在使用bluebird来初始化各种类型的数据库连接。
// fileA.js
Promise.all(allConnectionPromises)
.then(function (theModels) {
// then i want to do module.exports here
// console.log here so the expected output
module.exports = theModels
})
这样我可以从另一个文件中请求上面的文件。但如果我这样做,我会得到{}
。
let A = require('./fileA') // i get {} here
知道怎么做吗?
答案 0 :(得分:5)
您无法在Javascript中神奇地将异步操作转换为同步操作。因此,异步操作将需要异步编码技术(回调或承诺)。在常规编码中也与模块启动/初始化相同。
处理这个问题的通常设计模式是给你的模块一个构造函数,你传递一个回调函数,当你调用那个构造函数时,它将在异步结果完成后调用回调,然后再调用任何进一步的代码使用该异步结果必须在该回调中。
或者,既然您已经在使用promises,那么您只需导出调用代码可以使用的承诺。
// fileA.js
module.exports = Promise.all(allConnectionPromises);
然后,在使用它的代码中:
require('./fileA').then(function(theModels) {
// access theModels here
}, function(err) {
console.log(err);
});
注意,当这样做时,导出的promise也可以作为theModels
的方便缓存,因为执行require('./fileA')
的每个其他模块将获得相同的promise,因此具有相同的解析值获取模型后重新执行代码。
虽然我认为promises版本可能更清晰,特别是因为你已经在模块中使用了promises,这里是构造函数版本的比较结果:
// fileA.js
var p = Promise.all(allConnectionPromises);
module.exports = function(callback) {
p.then(function(theModels) {
callback(null, theModels);
}, function(err) {
callback(err);
});
}
然后,在使用它的代码中:
require('./fileA')(function(err, theModels) {
if (err) {
console.log(err);
} else {
// use theModels here
}
});