人気のあるJavaScriptモジュールQは、据え置き/約束/先物の概念を実装しています。主にnode.jsで使用されていると思いますが、ブラウザの使用もサポートしています。node.jsで使用しています。
シーケンシャルコールを実行するには、あるプロミスを次のプロミスにチェーンしますthen()
が、ループでは、この擬似コードと同じことを行うのが難しいと感じるよりも直感に反する可能性があります。
forever {
l = getline();
if (l === undefined) {
break;
} else {
doStuff(l);
}
}
Qのドキュメントには、非常によく似た例が含まれています。
var funcs = [foo, bar, baz, qux];
var result = Q.resolve(initialVal);
funcs.forEach(function (f) {
result = result.then(f);
});
return result;
しかし、この例を私の問題に適応させるために多くの方法を試みても、私はまったく成功していません。
サンプルコードとは異なり、配列を反復処理していませんが、終了条件が満たされるまでループしたいと考えています。また、私はいつも同じ関数を呼び出します。私の関数は、前の結果を次の呼び出しのパラメーターとして受け取りません。各呼び出しは引数を取りませんが、戻り値によってループを続行するかどうかが決まります。
これらの一見些細な違いは、ある種の乗り越えられない精神的ブロックを引き起こしています。これで、多くの人が約束を理解するのに苦労している理由がわかります。