我有一个类似的脚本:
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
的响应中获取我的数组的索引?
我可以通过制作一个计数器来做到这一点。但是当我再次调用该函数时,计数器被重置,所以我不想使用计数器。
无论如何我可以在每个循环上得到索引吗?
答案 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);
});
你觉得怎么样?