【发布时间】:2021-08-21 07:00:46
【问题描述】:
const globalObject = {};
const varAList = [.....];
const varBList = [.....];
const varA = await Promise.all(
varAList.map(
async (aObject) => {
const toReturn = [];
for (const bObject of varBList) {
if (!globalObject[bObject.id]) {
console.log(`getting ${bObject.id}`);
globalObject[bObject.id] = await getObject(bObject.id);
}
if (globalObject[bObject.id].important == true){
toReturn.push(globalObject[bObject.id].something)
}
}
return {aObject.id: toReturn}
}
)
);
此代码的问题在于,console.log(``getting ${bObject.id}``) 行将针对相同的 id 重复,因为 varAList 是并行的。如何确保我正在异步检查此对象并且如果它已经存在则不重新发出请求?
有什么解决办法吗?
【问题讨论】:
-
为什么不尝试异步调用 getObject 呢?让地图回调保持同步功能
-
发布的代码似乎被删减了太多——
.map函数参数的aObject参数没有被使用。除此之外,在迭代varAList数组之前尝试填充globalObject- 这可能可以同步完成, -
@advayrajhansa 抱歉,我没有按照你的说法删除
getObject的等待? -
@traktor 在我迭代
varAList之前填充globalObject有点超过了这个问题的目的。因为我仍然不知道globalObject中的内容,除非我遍历varAList -
更改无法编译:
{aObject.id: toReturn}无效。即使这样做了,循环的其余部分也会在每次循环迭代中生成一个具有相同值的toReturn数组。请在问题中包括代码试图做什么。
标签: javascript asynchronous promise