非同期ウォーターフォール メソッドを使用しようとしていますが、関数の 1 つに到達するとハングします。実行コンテキストに対して save() 操作が遅すぎるためだと思われますが、それが非同期のウォーターフォールを使い始めた理由であり、一連の次の関数に移動するまで値が返されるのを待つことができます (私の場合は以下の適切なデータ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
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);
});
};