Ádá*_*zay 5 rxjs typescript es6-promise
由于弃用而从 toPromise() 迁移到 firstValueFrom/lastValueFrom 时,我遇到了问题。当 toPromise() 按预期工作时,firstValueFrom/lastValueFrom 都不起作用。下面的示例代码显示了我的用例。这 3 个 Promise 都不会在 next() 上解析,而 firstValueFrom 应该解析。只有 toPromise() 才能完成解析,而所有 3 个都应该解析。最后,firstValueFrom/lastValueFrom 产生 EmptyError。
const subject = new Subject<boolean>();
setTimeout(async () => {
await subject.toPromise();
console.log("subject toPromise finished");
});
setTimeout(async () => {
await firstValueFrom(subject);
console.log("subject firstValueFrom finished");
});
setTimeout(async () => {
await lastValueFrom(subject);
console.log("subject lastValueFrom finished");
});
subject.next(true);
subject.complete();
Run Code Online (Sandbox Code Playgroud)
问题在于,firstValueFrom 方法在 Observable 完成后被调用。这对于 toPromise() 来说不是问题,因为在这种情况下它不会生成任何错误。但是,如果在调用它们时 Observable 已经完成,firstValueFrom/lastValueFrom 会生成错误。
我的解决方案是将Subject更改为ReplaySubject,因此当调用firstValueFrom/lastValueFrom时,将重播next()和complete()调用。
主观意见:我认为这种行为令人困惑。从已经完成的源生成 Promise 应该会产生与 Promise.resolve() 相同的行为。此外,如果在 next() 和complete() 之间调用firstValueFrom/lastValueFrom,则结果行为并不那么说明问题。当使用 Promise 时,我们通常使用单个值进行操作,该值要么存在,要么不存在。因此,我们用 undefined 解析的 toPromise() 的原始行为是更符合逻辑的默认行为。