我读过toPromise()在RxJS 7中被弃用,并将在RxJS 8中被删除。我经常使用它与异步等待语法在角角来处理http调用。这被认为是反模式吗?我理解流的概念,但是http调用只发出一个值。对于一个简单的http呼叫,我不明白什么是可观察的。接下来我该用什么?我应该完全接受反应性编程吗?
发布于 2021-04-11 11:19:06
为什么会发生这种事?
正如前面提到的这里,这些是反对toPromise的主要原因:
Observable原型中删除,并将其转换为独立的util函数。toPromise的命名并不是最好的。特别是与await结合使用时,它读起来不太好:await categories$.toPromise() vs await lastValueFrom(categories$)toPromise的类型信息错误。当源Observable完成时,没有发出一个值--它用undefined进行了解析。在这种情况下,它应予以拒绝。Promise是一种“承诺”,当它解析时,一个值就会出现--并且是undefined。但是,当流完成而不发出值时,您就无法区分一个有意发出undefined的流和一个没有发出任何消息的流。您下一步应该使用什么?
如果你真的坚持用承诺的方式去做,lastValueFrom/firstValueFrom。否则,切换到反应性编程将是一条路。
使用toPromise (不推荐)-
public async loadCategories() {
this.categories = await this.inventoryService
.getCategories()
.toPromise()
}使用lastValueFrom (新)-
import { lastValueFrom } from 'rxjs';
public async loadCategories() {
const categories$ = this.inventoryService.getCategories();
this.categories = await lastValueFrom(categories$);
} 这种联系应该有帮助-
https://indepth.dev/posts/1287/rxjs-heads-up-topromise-is-being-deprecated
发布于 2021-09-16 22:32:44
firstValueFrom和lastValueFrom无疑是一个更好的选择,原因有很多:
await lastValueFrom(data$, {defaultValue: 'Some default value'})有关此问题的更多信息,请参阅下面的视频:
发布于 2022-08-14 14:07:15
代码示例:
废弃用途:
await this.http.post<boolean>(`/someApi`).toPromise()
.then((value) => {
console.log(`Result: ` + value);
})新代码:
import { firstValueFrom } from 'rxjs';
await firstValueFrom(this.http.post<boolean>(`/someApi`))
.then((value) => {
console.log(`Result: ` + value);
})
https://stackoverflow.com/questions/67044273
复制相似问题