我正在循环对服务器进行异步调用。显然,它创造了竞争条件。这是代码。
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
函数调用应该是同步的。)。如果我可以使用类似Python的锁定机制,这是示例代码:
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 => {
//
});
}
从上面的代码可以清楚地看到,只有updateData
的调用正在等待,而不是对服务器的异步调用。是否可以在Javascript中实现类似的功能,如果可以的话,我该怎么做?
答案 0 :(得分:1)
Javascript execution is always single-threaded,因此除非您的updateData
函数本身包含异步调用,否则不会出现争用条件。