残念ながら、これら 2 つの非同期関数を希望する方法で確実にインターリーブする方法はありません (スレッドがないため、実行を「一時停止」することはできません)。それらは一貫性のない順序で完了する可能性があり、タイムアウトなどの解決策が必要になります。
アクティビティが書き込まれたり失敗したりしたときに、ログに記録する必要があるキューに入れられた (ハッシュされた?) アクティビティのリストを参照できるように、イベント ハンドラーをアクティビティ クラスに接続することをお勧めします。したがって、アクティビティが作成されたら、リストに追加します ( "onactivitycreated")
。その後、最終的には ( "onactivitywritten"
) と記述され、成功を比較して削除する可能性があります (モカで何が意味があるのかわかりません)。テストが完了すると、リストが空の。
util.inherits(Activity, EventEmitter)
たとえば、Activity クラスをイベント機能で拡張するために使用できます。
イベントを通じて処理されなかった障害があった場合は、それも処理する必要があります。
編集 -- 以下の提案は、うまくいかない非同期の興味深いデモとして無視してください。:)
それらをテストしたい場合は、asyncのようなライブラリを見て、コードを連続して(またはwaterfall
この場合は)実行できるようにして、最初に を作成しUser
、完了したら、正しいものActivity
が記録されていることを確認します。ここで使用waterfall
したのは、あるタスクから次のタスクに値を渡すことができるようにするためです。
async.waterfall([
function(done) {
User.create({name: "foo"}, function (err, user) {
if (err) { done(err); return; }
done(null, user._id); // 2nd param sent to next task as 1st param
});
},
function(id, done) { // got the _id from above
// substitute efficient method for finding
// the corresponding activity document (maybe it's another field?)
Activity.findById(id, function (err, act) {
if (err) { done(err); return; }
if (act) { done(null, true);
done(null, false); // not found?!
});
}
], function(err, result) {
console.log("Success? " + result);
});