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');
});

它需要aprox。2500 毫秒,但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 回答