同时执行两个可观察对象而不将它们转换为承诺
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()
我想一次(异步)调用多个 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()