【发布时间】:2020-04-26 21:58:27
【问题描述】:
我想锁定异步函数以防止同时执行。该函数只能由一个调用者执行,并且它应该在执行后得到 true 作为输出,而其他人得到 false 作为返回而不执行函数的逻辑内容。其他人不应等待当前调用者完成。
这是我迄今为止尝试过的:
class Lock {
constructor() {
this.locked = false;
}
lock(resolve) {
if (this.locked) {
resolve(false)
}
this.locked = true
return
}
release(resolve) {
this.locked = false;
resolve(true)
}
}
let lock = new Lock();
function myFunction() {
return new Promise(resolve => {
lock.lock(resolve);
//do something - this takes time includes some api calls and db operations
lock.release(resolve);
})
}
async function callSite() {
const executed = await myFunction();
if(executed){
//do something
}
else{
//do another thing
}
}
但似乎它没有按预期工作。谁能帮我改进一下?
【问题讨论】:
-
您期待什么,实际发生了什么?
-
当我快速调用这个调用站点函数时,它总是返回 true。为了测试,我在 lock.lock 和 then(lock.release) 之后使用了 fetch 函数。
-
它应该在未完成提取时挂断电话。
-
尝试
const executed = myFunction();- 删除await -
另外,在
lock类方法中,将最后一个命令return;替换为resolve (true);
标签: javascript async-await locking es6-promise