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);
});
你怎么看?
我有一个像这样的脚本:
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);
});
你怎么看?