Async-WaterFall不按预期工作

瀑布函数有两个调用,但第二个不等待第一个完全完成。 第一个有一个mongodb.find()调用。 这是async-waterfall函数

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()返回博客之前,不要调用seperateBlogs,但在返回值之前调用它是很重要的。 我使用Async_Waterfall来避免这个问题,但它不断重复,这意味着我使用它错了。 我在这里做错了什么,我该如何解决?

谢谢!

您的导出函数缺lesscallback参数:

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