如何在nodejs

时间:2016-01-23 10:00:48

标签: node.js promise

我正在使用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

知道怎么做吗?

1 个答案:

答案 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
    }
});