调用mongoose保存方法时,async.js的瀑布方法挂起

我试图使用asynchronous瀑布方法,但是当它到达其中一个函数,它挂起。 我怀疑这是因为save()操作对于执行上下文来说太慢了,但这就是为什么我开始使用asynchronous的瀑布,所以我可以等待返回的值,直到它到达系列中的下一个函数(传递适当的数据,这将在我的情况下counted )。

//在我的用户控制器中:

 async.waterfall([ function(callback) { getSubmission(id, function(submission) { if (submission) { callback(null, submission); } }); }, function(submission, callback) { var submissionId = submission._id; getViews(submissionId, ip, function(count) { if (count) { callback(null, count, submissionId); } }); }, // Those top two functions work perfectly passing what // I need to this one which is where I'm having trouble function(views, submissionId, callback) { // addView is called because it is actually // inserting a row in the db, but never returns from the caller addView(submissionId, ip, function(added) { // this callback doesn't fire if (added) { callback(null, added); } }); }, function(added, callback) { console.log(added); } ]); 

这就是addView() (也在用户控制器中,也就是之前的async.waterfall代码所在的async.waterfall ):

 var addView = function(submissionId, ip, callback) { Submission.addView({ submissionId : submissionId, ip: ip }, function(err, counted) { if (err) { throw err; } if (counted) { callback(counted); } }); }; 

当它调用Submission.addView()时,这就是它的调用(在我的提交模型文件中Submission.addView()

 exports.addView = function(obj, fn) { var ip = obj.ip, submissionId = obj.submissionId, submissionView = new SubmissionView(obj); // it gets to this point submissionView.save({ ip : ip, submission_id : submissionId }, function(err, counted) { fn(err, counted); }); }; 

每当asynchronous“挂起”,通常是因为callback没有被调用。

您需要确保您在所有代码path中调用callback。 我还build议你保留任何asynchronouscallback的第一个参数是一个错误,即使你不使用它,因为这是整个node.js使用的模式。 一些模块依赖于这种模式。 例如域。

如果你做出下面的改变,那么我会希望在某处popup一些错误:

 getSubmission(id, function(submission) { if (submission) { callback(null, submission); } }); 

应该是这样的:

 getSubmission(id, function(err, submission) { if(err){ return callback(err); } if (!submission) { return callback('no submission found'); } callback(null, submission); });