2017-03-03 3 views
4

私は、一連の約束事を順番に実行しようとしていますが、前回の解決後に次のものに進むだけです。 Bluebirdのドキュメントより:Bluebird mapSeries

イテレータは、前のアイテムまでアイテムに対して呼び出されず、そのアイテムのイテレータによって返された約束が満たされます。 http://bluebirdjs.com/docs/api/promise.mapseries.html

var Promise = require('bluebird'); 


function test(time) { 
    return new Promise(function(resolve, reject) { 
     setTimeout(function() { 
      console.log(time); 
      resolve(time); 
     }, time); 
    }); 
} 

Promise.mapSeries([test(2000), test(1000), test(500), test(3000)], function(a) { 
    return a; 
}).then(function(results) { 
    console.log(results); 
}); 

私は期待してどのようなテスト関数の内部にconsole.logを表示するようにということである:2000年、1000年、500、3000の順に。私は、ドキュメントの状態として、前の項目が解決された後にのみ各項目が移動することを期待しています。代わりに、私は500、1000、2000、3000を取得します。これは、すべての関数がinstanstaneouslyと呼ばれることを反映しています。さらに、結果は、呼び出された順に結果が表示されますが、現時点では無関係です。

ここで何かを誤解していますか?

+0

_Creating_約束(これは 'test'と同じ)は同期動作です。 – robertklep

+0

確かに、私はブルーバードがいくつかの魔法をやろうとしていて、前回のテストが終わるまで次のテストを呼びたいと思っています。その医師の言うことではないですか? – yBrodsky

+1

アイテムの約束を返すイテレータと、それ自身が約束しているアイテム(あなたの場合に起こる)との間には違いがあります。 'test'を呼び出すと、それが"開始する "という約束が返されます(' setTimeout'が呼び出されます)。答えは、ブルーバードが明示的にそれを要求するまで、約束の作成を延期する方法を示しています(それが働く唯一の方法です)。 – robertklep

答えて

5

あなたのテストコールは、の前にあります。Promise.mapSeriesは、これまでどおり実行することができます。また、mapSeriesは、通常、promiseインスタンス上で実行されます。おそらく次の例は理解するのに役立つでしょうか?この時点でのテスト(時間)が返されることに注意してください。

function test(time) { 
    return function(value) { 
     return new Promise(function(resolve, reject) { 
      setTimeout(function() { 
       console.log('time', time); 
       resolve(time); 
      }, time); 
     }); 
    }; 
} 

Promise.resolve([test(2000), test(400), test(1000), test(1), test(5000)]) 
     .mapSeries(function(asyncMethodPassed) { 
    return asyncMethodPassed(); 
}).then(function(results) { 
    console.log('result', results); 
}); 
+0

おはよう、ありがとう。 – yBrodsky

+0

これは私が自分のコードを100回持っていただけの問題のタイプです:-) –

関連する問題