打字稿:将For循环转换为Promise并等待解决所有问题

Typescript: Convert For loop to Promise and wait to resolve all

问题: save.emit() 在下面的“for”循环中完成所有迭代之前运行,该循环显示了不正确的 addUpdate 值在循环内调用。

我正在尝试将 for 循环转换为 promise,然后等待每个 promise 解决,以便我可以发出更改并关闭弹出窗口。

下面是一个测试代码,我想在每次迭代中首先打印“console.log("Print Before")”,然后在所有迭代完成后最后打印“console.log("Print After")”。

非常感谢任何有关此语法的帮助。

  convertForLoopToPromiseAndWait(someParameterOfTypeObject) {
    for (var test of someParameterOfTypeObject) {
      var testVariable = test.setValue;
      if (testVariable) {         
          dataService.addUpdateEndpointCall();
          console.log("Print Before");    
      }
    }
    console.log("Print After");
    save.emit();
  }

      async addUpdateEndpointCall() {
        const promise1 =  this.dataService.addCall().take(1).toPromise();
        const promise2 =  this.dataService.deleteCall().take(1).toPromise();
    
        await Promise.all([promise1, promise2])
          .then(_ => this.save.emit());
      }

convertForLoopToPromiseAndWait转换为异步方法,然后您可以在关键字之后和dataService.addUpdateEndpointCall();

之前使用await
async convertForLoopToPromiseAndWait(someParameterOfTypeObject) {
  for await (var test of someParameterOfTypeObject) {
    var testVariable = test.setValue;
    if (testVariable) {         
      await dataService.addUpdateEndpointCall();
      console.log("Print Before");    
    }
  }
  console.log("Print After");
  await save.emit();
}

我认为你在这里犯了一个错误:

const promise1 = await this.dataService.addCall().take(1).toPromise();
const promise2 = await this.dataService.deleteCall().take(1).toPromise();

你在等待承诺。放入变量 promise1promise2 的结果将不是承诺。

你不是说下面的吗?

      async addUpdateEndpointCall() {
        const promise1 = this.dataService.addCall().take(1).toPromise();
        const promise2 = this.dataService.deleteCall().take(1).toPromise();
    
        await Promise.all([promise1, promise2])
          .then(_ => this.save.emit());
      }

另一种方法是列出承诺并等待它们解决:

const promises = [];
        for await (your iterating condition) {
          promises.push(dataService.addUpdateEndpointCall());
        }

然后使用

await Promise.all(promises).then( this.save.emit());