-1

例では:

async.eachLimit([1,2,3,4,5,6,7,8,9,10], 6, function(a, b) {
    console.log("current: " + a);
    b("done");
  },
  function(err) {
    if (err) {
      console.log("error");
    } else { 
      console.log("completely done");
    }
  }
);

出力:

current: 1
error
current: 2
current: 3
current: 4
current: 5
current: 6
undefined

なぜそのような奇妙な行動をするのですか?エラーと未定義はどこから来ますか? そして、他の 4 つの要素はどこで処理されますか? 非同期のコールバックはいつ呼び出されますか? 私から期待されるように:

current: 1
done
current: 2
done
current: 3
done
current: 4
done
current: 5
done
current: 6
done
current: 7
done
current: 8
done
current: 9
done
current: 10
done
compeletely done

そのため、同時にアクティブになる要素は 6 つだけです。

期待どおりに非同期の動作を取得するには、何を変更する必要がありますか?

アップデート:

そして、私が使用する場合

async.**eachSeries**([1,2,3,4,5,6,7,8,9,10], function(a, b) {
    console.log("current: " + a);
    b("done");
  },
  function(err) {
    if (err) {
      console.log("error");
    } else { 
      console.log("completely done");
    }
  }
);

出力も奇妙です:

current: 1
error
undefined
4

1 に答える 1

2

多くの問題は、次の行に起因します。

b("done");

これは、それが最初の引数であるため、次のように設定"done"されます。err

イテレータには a が渡され、callback(err)完了後に呼び出す必要があります。エラーが発生していない場合は、コールバックを引数なしで実行するか、明示的な null 引数を指定して実行する必要があります。

期待どおりにリストした出力に基づいて、おそらく次のことが必要でした。

console.log("done");
b(null); // or: `b()`

  1. エラーと未定義はどこから来ますか?

    errorからのものですcallback

    if (err) {
        console.log("error");
    }
    

    undefinedただし、スニペットからのものではありません。ただし、Node の対話型 REPL を使用している場合は、eachLimitreturn値 (つまりundefined) が表示されるため、それがソースになります。

  2. 非同期のコールバックはいつ呼び出されますか?

    errが渡されると、がcallback早期に呼び出されます。

  3. そして、他の 4 つの要素はどこで処理されますか?

    errが渡されると、関数asyncは反復を停止します。停止する前に現在の「バッチeachLimit」を終了することを選択したためだけです。6


eachLimit()vsに関してeachSeries()は、それは が何をするかによって異なりiteratorます。現在、iteratorは完全に同期的であるため、どちらの関数もほぼ同様に実行され、一度に 1 つの値を繰り返します。

そして、明確にするために:asyncライブラリは同期タスクを非同期にすることはできません。実際には、タスクがすでに非同期であると想定しており、単にそれらのグループを管理するのに役立ちます。

于 2013-07-12T06:13:23.317 に答える