私は、一連の約束事を順番に実行しようとしていますが、前回の解決後に次のものに進むだけです。 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と呼ばれることを反映しています。さらに、結果は、呼び出された順に結果が表示されますが、現時点では無関係です。
ここで何かを誤解していますか?
_Creating_約束(これは 'test'と同じ)は同期動作です。 – robertklep
確かに、私はブルーバードがいくつかの魔法をやろうとしていて、前回のテストが終わるまで次のテストを呼びたいと思っています。その医師の言うことではないですか? – yBrodsky
アイテムの約束を返すイテレータと、それ自身が約束しているアイテム(あなたの場合に起こる)との間には違いがあります。 'test'を呼び出すと、それが"開始する "という約束が返されます(' setTimeout'が呼び出されます)。答えは、ブルーバードが明示的にそれを要求するまで、約束の作成を延期する方法を示しています(それが働く唯一の方法です)。 – robertklep