javascript Promise.all returns 仅最后承诺

javascript Promise.all returns last promise only

我有一个像这样的脚本:

var a = [{'a': 1},{'b': 2}]
var allPromises = new Array(a.length)
for(var i in a) {
    allPromises[i] = Promise.resolve().then(response => {
      console.log(i)
      console.log(a[i])
      // Do somethig on every loop with key and value
      return i
    })
}

Promise.all(allPromises).then(response => console.log(response))

在我的 for loop 中,它只给我最后一个索引和最后一个索引的值,而我想要每个循环的值并使用键和值执行一些操作。但是我得到了最后一个键和仅值..

我尝试获取 Promise.all 的响应值,但没有成功。

如何在 allPromises 的响应中获取我的数组索引?

我做一个计数器就可以了。但是当我再次调用该函数时,计数器被重置,所以我不想使用计数器。

我是否可以在每个循环中获取 promise 的索引?

您的 for 循环中的 .then() 处理程序中的 i 变量不是您认为的那样。在任何 .then() 处理程序被调用之前,您的 for 循环已经 运行 完成(因为它们总是 运行 在未来的滴答中异步)。因此,你只认为你看到了最后一个承诺,但实际上所有的承诺都工作正常,只是它们都返回了 i.

的最后一个值。

您可以通过使用 .forEach() 迭代数组来修复它,因为它唯一地捕获 i.

的每个值

var a = [{'a': 1},{'b': 2}]
var allPromises = new Array(a.length);
a.forEach(function(item, i) {
     allPromises[i] = Promise.resolve().then(response => {
      console.log(i)
      console.log(a[i])
      // Do somethig on every loop with key and value
      return i
    })
});

Promise.all(allPromises).then(response => console.log(response))

或者,由于您要生成一个数组,因此您可以使用 .map():

var a = [{'a': 1},{'b': 2}]
var allPromises = a.map(function(item, i) {
  return Promise.resolve().then(response => {
    console.log(i)
    console.log(a[i])
    // Do somethig on every loop with key and value
    return i
  })
});

Promise.all(allPromises).then(response => console.log(response))

我觉得承诺一切都很酷,但很遗憾告诉你,你错了。这是所有演示的承诺:

var p = [];
p[0] = new Promise((resolve, reject) => { 
  setTimeout(resolve, 1000, "one"); 
}); 
p[1] = new Promise((resolve, reject) => { 
  setTimeout(resolve, 1000, "two"); 
}); 
p[2] = new Promise((resolve, reject) => { 
  setTimeout(resolve, 2000, "three"); 
});
p[3]= new Promise((resolve, reject) => {
  setTimeout(resolve, 3000, "four");
});
p[4] = new Promise((resolve, reject) => {
  setTimeout(resolve, 4000, "done");
});

Promise.all(p).then(value => { 
  console.log(value);
});

所以我认为您的代码是这样的:

var arr = [{ a: 1 }, { b: 2 }];
var p = [];
arr.forEach((val, err) => {
  var promiseFunction = new Promise((resolve, reject) => {
    resolve(val);
  });
  p.push(promiseFunction);
})

Promise.all(p).then(value => { 
  console.log(value);
});

你怎么看?