Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
锁定Javascript函数_Javascript_Angular_Typescript - Fatal编程技术网

锁定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 => {
    //
  });
}