如何通过循环将解析推送到数组?

时间:2019-06-19 09:28:16

标签: javascript arrays object ecmascript-6 promise

运行以下代码时,我的代码存在一些问题。

预期结果:

['test0,'test1','test2']

实际结果:

['test3','test3','test3']

代码:

var overall = [];

for(var a=0;a<3;a++){
    var test_promise = new Promise(function(resolve,reject){
        setTimeout(()=>{
            console.log("looping: " + a);
            resolve('test' + a);
        },3000);
    });

    overall.push(test_promise);
}

Promise.all(overall).then(function(value){
    console.log(value);
});

4 个答案:

答案 0 :(得分:4)

要修复此问题,您应在for循环中将 var 更改为 let (关闭问题)

for(let a=0;a<3;a++)

以上结果是因为var全局定义了变量,或在整个函数中局部定义了变量,而不管块范围是什么。

  

let允许您声明范围限于   块,语句或使用它的表达式。这不一样   var关键字,用于全局或局部定义变量   整个功能,无论块范围如何。

例如

for(var i = 1; i <= 5; i++) {
   setTimeout(function() {
       console.log('Value of i : ' + i); 
   },100);
} 

上述代码的所需输出

Value of i : 1
Value of i : 2
Value of i : 3
Value of i : 4
Value of i : 5

但是实际输出是

Value of i : 6
Value of i : 6
Value of i : 6
Value of i : 6
Value of i : 6

以上结果是因为var全局定义了变量,或在整个函数中局部定义了变量,而不管块范围是什么。

for(let i = 1; i <= 5; i++) {

   setTimeout(function(){
       console.log('Value of i : ' + i);
   },100);
}
Output:
Value of i : 1
Value of i : 2
Value of i : 3
Value of i : 4
Value of i : 5

在您的情况下,您的代码将为:

for(let a=0;a<3;a++){
    var test_promise = new Promise(function(resolve,reject){
        setTimeout(()=>{
            console.log("looping: " + a);
            resolve('test' + a);
        },3000);
    });

    overall.push(test_promise);
}

答案 1 :(得分:0)

您需要使用let并将值传递给promise,如下所示:

 

var overall = [];

for(let a=0;a<3;a++){
(aa => {
let test_promise = new Promise(function(resolve,reject){
    setTimeout(()=>{
        console.log("looping: " + a);
        resolve('test' + aa);
    },3000);
});

overall.push(test_promise);
})(a);
}

Promise.all(overall).then(function(value){
console.log(value);
});
 

答案 2 :(得分:0)

快速答案:使用let a = 0代替var a = 0

更长的答案:var被全局吊起,let和const根据当前范围被吊起。 因此,当您在超时后将数组压入数组时,它会等于a的当前值,也就是for循环的最后一次迭代。 使用const或let时,您的promise的a值将在闭包中使用。

答案 3 :(得分:0)

使用let代替在循环中使用var。您可以从Difference between var and let?

那里获得有关var的更好的主意。

var overall = [];

for(let a=0;a<3;a++){
    var test_promise = new Promise(function(resolve,reject){
        setTimeout(()=>{
            console.log("looping: " + a);
            resolve('test' + a);
        },3000);
    });

    overall.push(test_promise);
}

Promise.all(overall).then(function(value){
    console.log(value);
});