2013-03-25 56 views
1

我试图使用async waterfall method,但是当它到达其中一个函数时,它会挂起。我怀疑这是因为save()操作对于执行上下文来说太慢了,但这就是为什么我开始使用异步的瀑布,所以我可以等待返回的值直到它进入系列中的下一个函数(传递正确的数据与它在我的情况下将是counted)。调用猫鼬时async.js挂起的瀑布方法保存方法

//在我的用户控制:

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代码也为):

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()时调用(在我的提交模型文件中):

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

回答

4

每当异步“挂起”时,通常都是因为没有调用回调。

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

如果你把下面的变化,那么我会期待一些错误的地方弹出:

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

原来我是路过的2种方法Mongoose'save()'方法,但它只需要一个,这样就可以摆脱我通过修复它的参数。 – 2013-03-26 19:51:01