查询数据库时出现异步瀑布问题

时间:2015-06-17 21:04:11

标签: node.js mongodb csv asynchronous waterfall

我正在构建一组要从csv流保存在mongoDB中的对象。对于每个csv行,我需要在保存MongoDB中不存在对象之前进行验证。以下代码在GET路由中运行。

我一直在尝试使用异步瀑布,但它的行为与我的预期不同。

这是代码

    async.waterfall([
        function (callback) {

            console.log('in function 1');
        -->  Diagnosis.findOne({name: diagnosisName}, function (doc){
                console.log(JSON.stringify(doc))
            })
            callback(null);

        },
        function (callback) {

            console.log('in function2')
            callback(null)
        }],

    function(err, results) {
        console.log('finished!')
        res.send("complete");
    })

我希望这会返回以下

在function1

中 JSON中的

doc对象

在function2中

完成!

而不是

功能1中的

在function2中

完成!

只要没有findOne()调用,它就会按预期运行。 我错过了什么?

非常感谢

2 个答案:

答案 0 :(得分:1)

findOne是一个异步函数。您需要在此函数中移动回调以遵循您期望的顺序。

async.waterfall([
    function(callback) {
      console.log('in function 1');
      Diagnosis.findOne({name: diagnosisName}, function(doc) {
        console.log(JSON.stringify(doc));
        callback(null);
      });

    },
    function(callback) {

      console.log('in function2');
      callback(null);
    }
  ],

  function(err, results) {
    console.log('finished!');
    res.send("complete");
  }
);

但为什么不使用内部承诺(或其他承诺lib)?

console.log('in function 1');
// exec creates a new promise
Diagnosis.findOne({name: diagnosisName}).exec(function(doc) {
  console.log(JSON.stringify(doc));
  // resolve this with doc
  return doc;
}).then(function(doc) {
  console.log('in function2');
  // resolve this with doc
  return doc;
}).then(results) {
  // results here is just doc from the previous resolution
  console.log('finished!');
  res.send("complete");
});

答案 1 :(得分:0)

在你的第一个职能中:

    function (callback) {

        console.log('in function 1');
    -->  Diagnosis.findOne({name: diagnosisName}, function (doc){
            console.log(JSON.stringify(doc))
        })
        callback(null);

    },

在调用异步的findOne后调用您的回调。只要findOne完成,你就应该使用你的回调。 这意味着:

    function (callback) {

        console.log('in function 1');
    -->  Diagnosis.findOne({name: diagnosisName}, function (doc){
            console.log(JSON.stringify(doc))
            callback(null);
        })


    },

甚至更好

    function (callback) {

        console.log('in function 1');
    -->  Diagnosis.findOne({name: diagnosisName}, callback);


    },
    function (callback, doc) {
        console.log(JSON.stringify(doc))
        callback(null);
    },