锁定Javascript函数

时间:2019-02-18 11:22:00

标签: 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 => {
    //
  });
}

我需要一种避免竞争条件的机制。但是同时,我不想链接异步调用(我希望它们并行工作,仅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中实现类似的功能,如果可以的话,我该怎么做?

1 个答案:

答案 0 :(得分:1)

Javascript execution is always single-threaded,因此除非您的updateData函数本身包含异步调用,否则不会出现争用条件。