【发布时间】:2021-11-28 00:17:55
【问题描述】:
我很难理解为什么在等待Promise.all() 之后我仍然有未决的承诺。
在下面的示例中,我使用 .map() 对数组的每个元素调用异步函数来创建一个 Promise 数组。
现在,为什么承诺仍然显示为待处理?我现在(错误)理解它的方式:
-
一旦来自
storeData()的承诺解决,then()就会触发 -
storeData()resolves 一旦newDataArray返回 -
一旦
promisesArray中的所有承诺都已解决或第一个承诺被拒绝,newDataArray就会返回。
storeData(OldDataArray).then(values => console.log(values))
// console shows:
// { id: 1, data: Promise { <pending> } },
// { id: 2, data: Promise { <pending> } }
const storeData = async (OldDataArray) => {
try {
const promisesArray = OldDataArray.map((item) => {
let newData = downloadMoreDetails(item.id, item.group); //async function, see below
return {
id: item.id,
data: newData,
};
});
const newDataArray = await Promise.all(promisesArray); // <-- I'm awaiting all promises to complete before assigning to newDataArray
return newDataArray;
} catch (error) {
console.log(error)
}
};
const downloadMoreDetails = async (id, group) => {
const response = await fetch(
`example.com/id/group.xml`
);
if (!response.ok) {
throw new Error(`HTTP error ${response.status}`);
}
const str = await response.text();
const json = convert.xml2json(str, {
compact: true,
spaces: 2,
});
return json;
};
【问题讨论】:
-
promisesArray不是一组承诺,这就是为什么等待它什么都不做。 -
谢谢!如果异步函数总是返回一个promise,并且我在map 中调用了一个异步函数,为什么map 的结果不是一个promise 数组?
-
If async functions always return a promise and I'm calling an async function inside map因为作为异步函数和调用异步函数是不同的东西。您传递给map的函数不是异步的。 -
newData是一个承诺,但您正在等待{id: item.id, data: newData }的数组。Promise.all()不会在这些对象内部查找承诺并等待该承诺。它只看到一组普通对象,这意味着它没有任何事情要做。 -
向你的数组添加承诺,而不是对象...
OldDataArray.map(({ id, group }) => downloadMoreDetails(id, group).then(data => ({ id, data })))
标签: javascript node.js promise