我有一个对象数组,我为每个对象执行一个 promise 。然后,如果一切都解决了,我希望在 Promise.all
中获得 .then
调用。问题是,在下面的示例中我只得到输出
All done in approach 2
我认为以下代码非常具有解释性,但简而言之,我正在做的是:
- 将 3 个对象声明为
vals
,我想根据每个对象创建一个 Promise。 - 方法 1:使用
vals.map
获取基于vals
的 Promise 数组 - 方法 2:使用
for
迭代vals
,并在每次迭代中推送新的 Promise。
这段代码有什么问题,为什么它只适用于方法 2?
#!/usr/bin/env node
let vals = [
{
name: "name1"
},
{
name: "name2"
},
{
name: "name3"
}
];
function newPromise(obj) {
return new Promise((resolve) => Promise.resolve(obj.name))
}
/**
* Approach 1: use .map function to get an array of promises
*/
let promises = vals.map((item) => newPromise(item));
Promise.all(promises)
.then(() => console.log("All done in approach 1"))
.catch(() => console.log("Error in approach 1"));
/**
* Approach 2: iterate through vals using a for an push a new promise for the promises array
*/
let promises2 = [];
for (let i = 0 ; i < vals.length; i++) {
promises.push(newPromise(vals[i]));
}
Promise.all(promises2)
.then(() => console.log("All done in approach 2"))
.catch(() => console.log("Error in approach 2"));
我正在使用带有 ES6(原生 Promises)的 Node 8.9.1。
最佳答案
你有两个小错误,这些错误使作品变得困惑且令人困惑。
首先,你的第二种方法不应该起作用,因为你不小心让它将它们推送到第二种方法的promises
而不是promises2
,所以你正在使用一个空数组执行Promise.all()
,这就是它起作用的原因。
然后,两者都不起作用的原因是您创建 promise 的方式。您将 Promise.resolve()
嵌套在 new Promise()
中,但这不起作用。您可以使用以下任一方法:
return new Promise(resolve => resolve(obj.name));
或
return Promise.resolve(obj.name);
这些是等效的。将它们放在里面,您从未在 new Promise()
中调用正确的 resolve()
函数,因此实际上没有解决任何问题。
let vals = [
{
name: "name1"
},
{
name: "name2"
},
{
name: "name3"
}
];
function newPromise(obj) {
return new Promise((resolve) => resolve(obj.name))
}
/**
* Approach 1: use .map function to get an array of promises
*/
let promises = vals.map((item) => newPromise(item));
Promise.all(promises)
.then(() => console.log("All done in approach 1"))
.catch(() => console.log("Error in approach 1"));
/**
* Approach 2: iterate through vals using a for an push a new promise for the promises array
*/
let promises2 = [];
for (let i = 0 ; i < vals.length; i++) {
promises2.push(newPromise(vals[i]));
}
Promise.all(promises2)
.then(() => console.log("All done in approach 2"))
.catch(() => console.log("Error in approach 2"));
关于javascript - 使用过滤器返回 Promise.all 的 promise 数组不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47574701/