在for循环中将Promise添加到Promise数组中

5

假设我们有以下示例:

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

大约需要2500毫秒,但是console.log('done')没有被调用。 出了什么问题,我做错了什么吗?

祝一切顺利, redshark1802

1个回答

15

这是什么问题,我做错了什么吗?

deferred 变量不在循环体内部定义,而是在全局范围内。每次迭代都会重写它,并且只解决最后一个(但多次)。

要解决这个问题,您可以尝试使用闭包,但是您不应该使用Deferred。只需使用已经存在的 Promise 就可以了!

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接