javascript – 在for循环中为promises数组添加promises

参见英文答案 > JavaScript closure inside loops – simple practical example                                    39个
我们假设以下示例:

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. 2500ms但是没有调用console.log(‘done’).
有什么问题,我做错了吗?

最好的,
redshark1802

解决方法:

What’s the problem with, am I doing wrong?

延迟变量不是循环体的局部变量,而是全局范围.你每次都使用新的Deferred覆盖它,并且只解析它们中的最后一个(但是多次).

要修复它,你可以尝试closure,但是你shouldn’t use Deferred anyway.只需使用你已经拥有的承诺!

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');
});
上一篇:javascript – 如何使用Promise.all避免promise构造函数反模式


下一篇:javascript – 蓝鸟承诺的正确while()循环(没有递归?)