1

オブジェクトのセットをループして、コールバック関数内の値を確認する必要があります。私の問題は、値が見つからない場合、単一のエラーをスローする必要があるため、これはコールバックとループの外側にある必要があるということです。

今私はこれを持っています:

for (i = 0; i < response._conflicts.length; i += 1){
    del_rev = response._conflicts[i];
        // retrieve a document
        that.addJob( 
            "get",
            someID,
            options,
            // callback
            function (response) {
                if (condition 1) {
                    if (condition 2){
                        console.log("gotcha");
                        // run a function                    
                        f.removeDocument(someID+x);
                        return;
                    }
                } 
            },
            function (err) {
                that.error({ "status": 123 });
            }
        );
    } // end of loop

    // now if the loop turns out no results, I need to throw this error
    that.error({ "status": 404 });
    return;

私の問題は、404コールバックチェックが条件が満たされているかどうかを検出する前に2番目のエラーがトリガーされるため、404条件が満たされ、トリガーされると、常に2番目の関数がトリガーされることになりf.removeDocument(someID+x)ます。

f.removeDocument(someID+x)コールバックとループから削除し、変数をtrue / falseに設定してから、エラーをスローするか、関数を呼び出してみました。ただし、同じ結果=変数はfalseであり、コールバックでtrueに設定される前にエラーをスローします。

エラーをループ内とコールバック内に配置する必要があると思い404ますが、ループが完了し、条件が満たされていない場合に1回だけエラーが発生するようにする方法がわかりません。

質問
ループでトリガーされるコールバック関数内でエラーを1回スローするにはどうすればよいですか?

4

1 に答える 1

2

これは非同期性の問題のようです。コールバックを一種の結合操作として処理するには、最後のコールバックを待つ必要があります。次のようなパターンが役立つ場合があります。

var join = (function(n, fn) {
  return function() {
    if(--n === 0) {
      fn();
    }
  }
}) (response._conflicts.length, function() {
  // Check the conditions
});

参加機能は必要な回数をカウントダウンし、最後の呼び出しが完了した後に残りのチェックを実行できるようにします。join()リクエストのコールバックでトリガーする必要があります。

于 2013-01-04T14:22:41.410 に答える