我最终推动未解决的承诺成为对象的值,然后等待稍后调用这些承诺:
let names = ["aaron", "bob", "john", "aaron"];
let allNames = {};
//只是用名称作为关键来设置我的对象
names.forEach(name => {
if (!allNames[name]) {
allNames[name] = null;
}
});
//并行迭代并运行异步请求,并将未解析的promise存储为对象值
let allDataForNamedPerson;
for (const [x] of names) {
if (!allNames[name]) {
allDataForNamesPerson = this.getNameData(name)// async api call
allNames[name] = allDataForNamesPerson // storing the promise
}
}
然后我等待,直到所有这些都解决;
await Promise.all([...Object.values(this.allNames)]);
我的问题是,当我从对象中查找一个已解析的值时,例如:
allNames["john"]
,控制台中的值一个包裹在promise中的Object:
promise {
salary: 41992,
position: clerk
}
所以我不能通过allNames["john"].salary
访问它——它返回为未定义。我在这里做错了什么?
await
不会用承诺的值替换承诺。如果你想使用价值观,你必须自己抓住它们:
const resolvedValues = await Promise.all([...Object.values(this.allNames)]);
然后CCD_ 4给你展开的数据。
使用裸await
只能保证给定的promise在await
行之后的代码中得到解决,但值仍然被包装。