3

次の例を想定してみましょう。

var bb = require('bluebird');

var promiseStack = [];
var deferred = bb.defer();

promiseStack.push(deferred.promise);

bb.delay(2500).then(function() {
    deferred.resolve();
});

bb.all(promiseStack).then(function() {
    console.log('done');
});

次のことを実行できないのはなぜですか。

var bb = require('bluebird');

var promiseStack = [];


for(var i = 1; i < 10; i++) {
    var deferred = bb.defer();
    promiseStack.push(deferred.promise);

    bb.delay(2500).then(function() {
        deferred.resolve();
    });
}

bb.all(promiseStack).then(function() {
    console.log('done');
});

約かかります。2500ms ですがconsole.log('done')呼び出されません。何が問題なのですか、私は間違っていますか?

最高、redshark1802

4

1 に答える 1

13

何が問題なのですか、私は間違っていますか?

変数deferredはループ本体に対してローカルではなく、グローバル スコープにあります。毎回新しい Deferred で上書きし、最後のものだけを解決します (ただし、複数回)。

それを修正するには、 Closure を試すことができますが、とにかく使用ないDeferredでください。あなたがすでに持っている約束を使ってください!

var bb = require('bluebird');

var promiseStack = [];

for(var i = 1; i < 10; i++) // 1 to 9 ???
    promiseStack.push( bb.delay(2500) );

bb.all(promiseStack).then(function() {
    console.log('done');
});
于 2014-02-19T15:41:56.667 に答える