如何解决Javascript Promise-处理可能的竞争条件
我最近在网上遇到了这个问题,它是解决方案。但是我不完全了解解决方案。
问题:
this.resources = {};
async function getResource (name) {
if (this.resources[name]) {
return this.resources[name]
}
const resource = new Resource(name)
await resource.load()
this.resources[name] = resource
return resource
}
在这里,如果我们调用了名称为X的getResource
,并且在执行load
的过程中,我们又调用了一个名称为X的函数,那么它可能会创建另一个具有以下名称的资源:名称X。
解决方案是:
this.resources = {};
async function getResource (name) {
if (this.resources[name]) {
return this.resources[name]
}
const resource = new Resource(name)
this.resources[name] = resource.load().then(()=>resource)
return this.resource[name]
}
现在,此解决方案意味着this.resources[name]
将首先保存Promise对象,然后在解决诺言之后,将保存已加载的资源。
我的问题是,如果我们正在等待承诺的解决,并且到达名称为X的getResource
的另一个调用到达,它将通过if
语句,并再次调用{{1 }},然后等待new Resource(name)
结束。
但是这不会潜在地导致load
中的第一个X资源在第二个this.resources[name]
完成后被覆盖吗?
解决方法
另一个名为X的getResource调用到达,它将传递if语句
第二个呼叫将等到第一个呼叫完成。永远不会并行执行两个javascript用户函数。
这就是为什么第一个版本不起作用的原因-函数执行在等待中结束,并且在继续之前,可能会发生另一个调用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。