将诺言添加到for循环中的诺言数组中 [英] adding promises to an array of promises in a for loop

查看:73
本文介绍了将诺言添加到for循环中的诺言数组中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

让我们假设以下示例:

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

为什么不能执行以下操作:

Why isn't it possible to do the following:

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'). 有什么问题,我做错了吗?

It takes aprox. 2500ms but console.log('done') isn't called. What's the problem with, am I doing wrong?

最好的, redshark1802

The best, redshark1802

推荐答案

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

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

您的deferred变量不是循环体的局部变量,而是全局变量.每次都用新的Deferred覆盖它,并且只解析其中的最后一个(但是多次).

Your deferred variable is not local to the loop body, but on a global scope. You're overwriting it each time with a new Deferred, and resolving only the last of them (but multiple times).

要解决此问题,您可以尝试 closure ,但是您不应使用Deferred无论如何.只需使用您已经拥有的承诺即可!

To fix it, you could try a closure, but you shouldn't use Deferred anyway. Just use the promise you already have!

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

这篇关于将诺言添加到for循环中的诺言数组中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆