0

私は、その API に固有のノード ライブラリを多用する API と通信する node.js プロジェクトで忙しくしています。一時停止に関連する問題の種類とそのさまざまな解決策に関する既存の質問をすべて読みました (と思います) が、私の問題に正しい解決策を適用する方法はまだわかりません。

簡単に言えば、API ライブラリから複数回呼び出す関数があり、続行する前にそれらがすべて完了していることを確認する必要があります。これまで、同期/非同期のニーズを処理するために優れた caolan/async ライブラリを使用することができましたが、API ライブラリのこの特定の関数でブロックにぶつかりました。

この関数は、https と SOAP の呼び出し/解析を伴うため非常に複雑なので、caolan/async で動作するように書き直さないようにしています。

これは、複数回呼び出してから、すべての呼び出しが完了するまで待機する必要がある非同期関数です。コールバックやプロミス (q ライブラリ) を使用するさまざまな方法を試しましたが、期待どおりに動作させることができず、他の非同期 API 関数で正常に動作しました。

必死になって、既存のすべての非同期関数が完了するまで、プログラムのある時点でたとえば 5 秒間待つことができますが、5 秒が経過するまでそれ以上進行しないという厄介なソリューションを望んでいます。したがって、可能であれば、5 秒間のノンブロッキング一時停止が必要です。

おそらくファイバーを使用してこれを行うことができますが、そのルートに進む前に別のソリューションを本当に望んでいます.

4

1 に答える 1

0

問題に対する簡単な解決策の 1 つは、関数を呼び出すたびにカウンターをインクリメントすることです。次に、コールバックの最後にイベントを発行します。そのイベントをリッスンし、トリガーされるたびに個別のカウンターをインクリメントします。2 つのカウンターが等しい場合、先に進むことができます。

これは次のようになります

var function_call_counter = 0;
var function_complete_counter = 0;
var self = this;

for(var i = 0; i < time_to_call; i++){

    function_call_counter++;

    api_call(function(){
        self.emit('api_called');        
    });
}

this.on('api_called', function(){
    function_complete_counter++;
});

var id = setInterval(function(){
    if(function_call_counter == function_complete_counter){
        move_on();
        clearInterval(id); // This stops the checking
    }
}, 5000 ); // every 5 sec check to see if you can move on

約束はうまくいくはずですが、ちょっとした工夫が必要かもしれません。q について言及しましたが、Promise A+を確認することをお勧めします

于 2013-07-02T20:06:14.130 に答える