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



我正在构建一组要从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");
    })

我希望这会返回以下内容

在函数中1

JSON 中的文档对象

在函数2

完成!

相反,我得到

在函数 1 中

在函数2

完成!

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

非常感谢

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");
  }
);

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

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");
});

在你的第一个函数中:

    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);
    },

相关内容

  • 没有找到相关文章

最新更新