nodejs中module.export为一个异步返回结果时该怎么做?


在用mongodb的过程中我遇见了如下问题
a.js代码:


 var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017/local', function(err, db) {

  // Use the admin database for the operation
  var adminDb = db.admin();
  // List all the available databases
  adminDb.listDatabases().then(function(dbs) {
      var result = [];
      dbs.databases.forEach(function (element,index) {
          result.push(element.name);
      })
    db.close();
    module.exports = result;
  });
});

我在另外一个文件中引入
b.js代码:


 var data = require("a.js");
console.log(data); ///这时 data始终为 {} 因为a.js中的module.exports还未返回


我想到得做法 就是把a中的文件封装成一个函数,在b中引入再调用,比如:
b.js代码:


 var data = require("a.js")();
console.log(data);
但是这样每次require时都要调用这个函数,感觉好不爽,有什么办法解决上面的问题么?

node.js require node

小野妹汁。 9 years, 5 months ago

module.exports为什么放在then回调函数中呢?
要知道a.js的主逻辑是异步执行的~~~


 var data = require("a.js");
console.log(data);

建议:
1)export功能模块
2)export的模块继承EventEmitter
3)在promise函数执行完毕后,发送事件通知
4)在导入模块的地方,监听这个事件通知

水獭9绿坝子 answered 9 years, 5 months ago

你的实现有点奇怪,我觉得下面这种比较适合。

a.js


 var MongoClient = require('mongodb').MongoClient;


var main = {
  getResult: function(callback) {
    MongoClient.connect('mongodb://localhost:27017/local', function(err, db) {

      // Use the admin database for the operation
      var adminDb = db.admin();
      // List all the available databases
      adminDb.listDatabases().then(function(dbs) {
        var result = [];
        dbs.databases.forEach(function(element, index) {
          result.push(element.name);
        })
        db.close();
        callback(result);
      });
    });
  }
};

module.exports = main;

b.js:


 var a = require("./a");

a.getResult(function(result){
  console.log(result);
});

另外,require js文件并不用写 .js 扩展名。如果想用promise的方式而不用callback的方式写异步,请参考 bluebird

arthurf answered 9 years, 5 months ago

Your Answer