8

私は次のことにこだわっています:

スクリプトは、次のように任意の数値nまたは配列を返します。

[["a"], ["b"], ["c"], ["d"]]

promise を使用して配列をループする必要がありますthen()が、要素の数がわからないため、これを行うことになりました。

  var bundle_list = [["a"], ["b"], ["c"], ["d"]];

  var x = bundle_list.reduce(function(current, next) {
  console.log(current);

  // requestBundle will also return a promise
  return requestBundle(current)
    .then(function(bundle_response) {
      // do foo
      console.log("CALLING NEXT")
      console.log(next);
      return RSVP.resolve(next);
    });
})

x.then(function(last_response) {
  return console.log("DONE")
});

私の問題はreduce/map、非同期コードが実行される前に両方がすべての反復をトリガーすることです。そのため、コンソールが 3 倍になり、その後にcurrentコンソールが続きdoneます。したがって、すべてのマップの「ループ」は即座に実行され、結果は少し (あまりにも) 遅れて記録されます...

私はこのRSVP実装を使用していますが、これは A+ なので問題にはなりません。ここで提供されている回答に沿って作業しようとしていますが、適切に機能させることができません。

質問:任意の数のステートメント
で「then-chain」を作成することは可能ですか? thenもしそうなら、いくつかの指針をいただければ幸いです!

ありがとう!

4

1 に答える 1

10

for (または forEach) ループは次のことを行う必要があります。

var queue = RSVP.Promise.resolve(); // in ES6 or BB, just Promise.resolve();

bundle_list.forEach(function(el){
    queue = queue.then(function(res){
        console.log("Calling async func for", el);
        return requestBundle(el);
    });
});

queue.then(function(lastResponse){
    console.log("Done!");
});
于 2014-05-04T05:41:30.687 に答える