簡體   English   中英

Async-WaterFall無法正常工作

[英]Async-WaterFall not working as expected

帶有兩個調用的瀑布函數,但是第二個調用不等待第一個完全完成。 第一個調用了mongodb.find()。 這是異步瀑布功能

app.get("/news", function(req, res) {
    async.waterfall([
         function (callback) {

            var blogs = tendigiEngine.getAllBlogs(callback);
            callback(null, blogs);
          },
          function (blogs, callback) {

            var array = tendigiEngine.seperateBlogs(blogs, callback);
            callback(null, array );
          }

     ], function (err, result) {
       // result now equals 'done'   
       console.log("done"); 
       console.log(result);
    });

});

這是被調用的兩個函數:getAllBlogs():

exports.getAllBlogs = function() {

    Blog.find(function(err, theBlogs){
        if(!err) {
            return theBlogs;
         }
        else {
                throw err;
        }

      });
}

seperateBlogs():

exports.seperateBlogs  = function(blogs) {

      if(blogs.length === 0 ) {
            return 0;
        }
        else {
             blogs.reverse();
             var blog  = blogs[0];
             blogs.shift(); 
             var finArray = [blog, blogs];
             return finArray;
        }
      console.log("asdf");
}

重要的是,在getAllBlogs()返回theBlogs之前不會調用seperateBlogs,但是在返回值之前將調用它。 我使用Async_Waterfall來避免此問題,但它會不斷發生,這意味着我使用錯誤。 我在這里做錯什么,如何解決?

謝謝!

您導出的函數缺少回調參數:

exports.getAllBlogs = function(cb) {
  Blog.find(cb);
};

exports.seperateBlogs = function(blogs, cb) {
    if (blogs.length === 0 )
      return cb(null, blogs);

    blogs.reverse();
    var blog = blogs[0];
    blogs.shift(); 
    cb(null, [blog, blogs]);
}

然后,您的主要代碼也可以簡化:

async.waterfall([
   tendigiEngine.getAllBlogs,
   tendigiEngine.seperateBlogs
], function (err, result) {
   // result now equals 'done'   
   console.log("done"); 
   console.log(result);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM