在Promise循环中,如何等待请求响应?

时间:2019-05-30 09:21:45

标签: angular typescript

我正在尝试建立一个发送请求的循环。

但是,在发送下一个请求之前,我想等待接收请求的答复。我该怎么办?

 private start(): Promise<string> {
    return new Promise((resolve, reject) => {
      for (let j = 0, p = Promise.resolve(); j < count; j++) {
        p = p.then(_ => new Promise<null>(res =>
          setTimeout(() => {
            if (j === (count - 1)) {
              resolve();
            } else {
              this.http.get();
              res();
            }
          }, 1000)
        ));
      }
    });
  }

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

奇怪的是,当您已经在使用Angular时使用的是Promise(而不是observables)。

无论如何,当涉及到迭代承诺时,您可以使用Promise.all。我们将promise放入列表中,然后仅在执行for循环的所有迭代之后才解析promise。

const promisesList = [];
for (let j = 0; j < count; j++) {
  promisesList.push(promise);
}
Promise.all(promises).then(res => {
  // handle the rest here
})

如@robert所建议的,我将包括一个实现方法,该实现方法是如何使用observables / forkjoin解决上述问题。使用前,您需要从rxjs包中导入forkJoin

类似于Promises.all(),forkJoin()等待for循环完成,然后返回可观察的值。

import { forkJoin } from 'rxjs';

.
.
.

start() {
  const observablesList = [];
  const sendRequest = this.someService.someRequest(); // observable

  for (let j = 0; j < count; j++) {
    observablesList.push(sendRequest);
  }

  forkJoin(observablesList).subscribe(res => {
    console.log(res);
    //handle the rest
  });
}

答案 1 :(得分:1)

感谢大家的帮助, 最后,我根据@Capricorn响应写了这个

      private start(): Promise<string> {
    return new Promise((resolve, reject) => {
      for (let j = 0, p = Promise.resolve(); j < 10; j++) {
        p = p.then(() => new Promise<null>((res) => {
          this.get().then(() => res());
        }));
      }
    });
  }

  private get(): Promise<string> {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        alert('hello');
        resolve();
      }, 3000);
    });
  }

答案 2 :(得分:0)

您可以尝试

async mainFunction () {
for(let i = 0; i < count; i++) {
    await apiCallFunction();
    // other code 
}
}

apiCallFunction() {
 return new Promise((resolve, reject) => {
    this.http.get().subscribe(resp => {
      resolve();
    });
 })
}