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

标签 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);
});

最佳答案

要解决这个问题,您应该将 for 循环中的 var 更改为 let (闭包问题)

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

上面的结果是因为,var 全局定义变量,或者在整个函数中局部定义变量,而不管 block 作用域如何。

let allows you to declare variables that are limited in scope to the block, statement, or expression on which it is used. This is unlike the var keyword, which defines a variable globally, or locally to an entire function regardless of block scope.

例如

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 全局定义变量,或者在整个函数中局部定义变量,而不管 block 作用域如何。

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

关于javascript - 如何通过循环将解析推送到数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56664401/

相关文章:

javascript - 这个函数式 Javascript 示例如何工作?

java - java列表的内存占用计算和GC计算

javascript - 将 php 对象数组转换为 javascript 数组

javascript - 删除 div 折叠上的链接文本?

javascript - 遍历 dom 并选择每个输入框对以创建 js 对象

javascript - 用户 ID 函数 JavaScript

c# - 通过两个不同的接口(interface)访问同一个对象

javascript - Redux-thunk 与 redux-form - 不调度

arrays - HTTP GET 无休止地请求数据

c - 单独声明和初始化的变量如何在内存中工作?