javascript Promise.all仅返回最后一个承诺

时间:2016-07-27 07:00:22

标签: javascript promise es6-promise

我有一个类似的脚本:

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的响应中获取我的数组的索引?

我可以通过制作一个计数器来做到这一点。但是当我再次调用该函数时,计数器被重置,所以我不想使用计数器。

无论如何我可以在每个循环上得到索引吗?

2 个答案:

答案 0 :(得分:8)

i循环中.then()处理程序中的for变量不是您认为的那样。在调用任何for处理程序之前,您的.then()循环已经运行完毕(因为它们总是在将来的时钟周期内异步运行)。因此,你只是认为你看到了最后的承诺,但实际上所有的承诺都运转良好,只是它们都返回了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))

答案 1 :(得分:0)

我认为承诺都很酷,但很遗憾告诉你,你错了。这是一个承诺所有演示:

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

你觉得怎么样?