同时执行两个可观察对象而不将它们转换为承诺

Execute two observables at the same time without converting them to promises

我想一次(异步)调用多个 API 端点。我从单个 API 调用中得到一个 Observable,我想一起“等待”它们,并从每个调用中获取结果作为一个集合处理,最好有一个选项来处理异常(如果有的话)从每一个。很像 asyncio.gather() 但 Angular。我不想将 observable 转换为 promises,也不想使用 forkJoin()async 管道等已弃用的方法。还有其他解决办法吗?

因此,您只需将订阅包装在承诺中,而不是 'converting' 承诺的可观察对象(我假设您指的是 toPromise())。然后你使用 Promise.all() 同时等待它们。

  constructor(private http: HttpClient) {}

  async waitForResponses() {
    const obs1 = this.http.get('api1');
    const obs2 = this.http.get('api2');
    const obs3 = this.http.get('api3');

    const promise1 = new Promise((resolve) =>
      obs1.subscribe((result) => resolve(result))
    );
    const promise2 = new Promise((resolve) =>
      obs2.subscribe((result) => resolve(result))
    );
    const promise3 = new Promise((resolve) =>
      obs3.subscribe((result) => resolve(result))
    );

    const [result1, result2, result3] = await Promise.all<any>([promise1, promise2, promise3]);
    
    console.log(result1);
    console.log(result2);
    console.log(result3);
  }

这会同时等待所有 api 个调用,但您可以按照您喜欢的任何顺序等待它们。 Promise.all() returns 结果数组,与各自的承诺具有相同的索引。我很确定这正是您要找的。

错误处理:

    const promise1 = new Promise((resolve, reject) =>
      obs1.subscribe({
        next: (result) => resolve(result),
        error: (err) => reject(err),
      })
    ).catch((err) => console.log(err));

forkJoin 实际上并没有弃用 but some overrides of it are。 Observable 数组或字典是 forkJoin.

的有效输入

这不应引发任何关于弃用的警告。

const sources$: Observable<any>[] = [obs1$, obs2$, obs3$]
forkJoin(sources$).subscribe()