node.js に次のような単純なプログラムがあります。
// CODE1
step1();
step2();
var o = step3();
step4(o);
step5();
step6();
このプログラムは、(Web ブラウザではなく) スタンドアロン スクリプトで実行することを意図しており、実行順序が重要なシーケンシャル プログラムです (たとえば、step6 は step5 の後に実行する必要があります)。
問題は、step3() が非同期関数であり、値 'o' が実際には特定のコールバックに渡されるため、次のようにプログラムを変更する必要があることです。
// CODE2
step1();
step2();
step3( function (o) {
step4(o);
step5();
step6();
})
step3 で計算された 'o' 値に依存するため、コールバック関数から step4 を呼び出すことは理にかなっています。しかし、step5 と step6 関数は 'o' に依存しないため、実行順序を保持するためだけにそれらをそのコールバック関数に含める必要があります: step3、次に step4、次に step5、次に step6。
これは私には本当に悪いように聞こえます。これはシーケンシャルなプログラムなので、step3 を同期関数に変換したいと思います。
これを行う方法?私はこのようなものを探しています(例:Qを使用):
// CODE3
step1();
step2();
var deferred = Q.defer();
step3(deferred.resolve);
deferred.blockUntilFulfilled() // this function does not exist; this is what i am looking for
var o = deferred.inspect().value
step4(o);
step5();
step6();
これを行う方法?
ps: 同期または非同期の使用には長所と短所があり、これは非常に興味深い議論です。ただし、それはこの質問の目的ではありません。この質問では、約束 (または同等のもの) が満たされるまでブロック/待機する方法を尋ねています。同期/ブロックが良いかどうかについての議論を始めないでください。