【问题标题】:dealing with asynchronous updating of an object处理对象的异步更新
【发布时间】: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


【解决方案1】:

您的问题令人困惑,如果您理解正确,您不想遍历varAList

const globalObject = {};
const varAList = [.....];
const varBList = [.....];

async function* genarateResult() {
    for (const bObject of varBList) {
        let aObject = varAList.shift();
        let obj = globalObject[bObject.id];
        let toReturn = [];
        if (!obj) {
            console.log(`getting ${bObject.id}`);
            globalObject[bObject.id] = await getObject(bObject.id);
        }
        if (obj.important == true) {
            toReturn.push(obj.something)
        }
        yield { [aObject.id]: toReturn };
    }
}

for await (const val of genarateResult()) {
    console.log(val);
}

它能回答你的问题吗?还是我错过了什么?

【讨论】:

  • 我们应该迭代 varBList 还是 varAList ?在我的回答中,我遍历了varBList,对吗?
  • @Bergi,谢谢,指出!我稍后会更新我的答案...
  • 我的问题是当我使用地图并在地图中等待时,对 globalObject 类型的引用会变得很挑剔,就像在每次迭代或 varAList 时一样,即使我之前可能已经更新了 globalObject,我仍然无法验证该迭代是否之前完成,因为它是异步的。
  • @Sakibul Alam,你能举个例子吗?说明你的问题
猜你喜欢
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 2020-05-30
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多