锁定Javascript函数
我在循环中对服务器进行异步调用。显然,它创造了一个竞赛条件。这是代码锁定Javascript函数,javascript,angular,typescript,Javascript,Angular,Typescript,我在循环中对服务器进行异步调用。显然,它创造了一个竞赛条件。这是代码 for (let i = 0; i < arr.length; i++) { this.service.execute(arr[i]).pipe(takeUntil(this.ngUnsubscribe)).subscribe(response => { this.updateData(response); // Avoid race-condition here }, error => {
for (let i = 0; i < arr.length; i++) {
this.service.execute(arr[i]).pipe(takeUntil(this.ngUnsubscribe)).subscribe(response => {
this.updateData(response); // Avoid race-condition here
}, error => {
//
});
}
从上面的代码可以清楚地看到,只有
updateData
的调用在等待对方,而不是对服务器的异步调用。有可能在Javascript中实现类似的功能吗?如果有,我该怎么做呢?,因此除非您的updateData
函数本身包含异步调用,否则不存在争用条件。请看Promise.all()
只有当数组中的所有承诺都已解决或失败时,它才接受承诺和解决/拒绝的数组,但它仍然同时执行两个函数,这是我想要避免的。我知道没有内置功能可以做到这一点。我的第一种方法是使用类来管理锁。一次快速的搜索使我想到了。也许这就是你需要的。它不包含任何异步调用。这是否意味着我可以从不同的环境中安全地调用相同的函数?这取决于不同环境的含义。如果它们都发生在同一个程序/网页/脚本中,那么是的。
for (let i = 0; i < arr.length; i++) {
this.service.execute(arr[i]).pipe(takeUntil(this.ngUnsubscribe)).subscribe(response => {
// Assume lock is defined
this.lock.acquire();
this.updateData(response); // Avoid race-condition here
this.lock.release();
}, error => {
//
});
}