1

我正在构建一组要从 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() 调用,它就会按预期运行。我错过了什么??

非常感激

4

2 回答 2

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

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

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");
});
于 2015-06-17T21:15:43.693 回答
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);
    },
于 2015-06-17T21:19:02.413 回答