lastValueFrom 不起作用,而 toPromise 起作用
lastValueFrom does not work while toPromise works
由于弃用而从 toPromise() 迁移到 firstValueFrom/lastValueFrom 时,我 运行 遇到了问题。 firstValueFrom/lastValueFrom 都不起作用,而 toPromise() 按预期工作。下面的示例代码显示了我的用例。这 3 个承诺都不会在 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();
问题是在 Observable 完成后调用了 firstValueFrom 方法。这对 toPromise() 来说不是问题,因为在这种情况下它不会产生任何错误。但是如果 Observable 在调用时已经完成,firstValueFrom/lastValueFrom 会产生错误。
我的解决方案是将 Subject 更改为 ReplaySubject,因此当调用 firstValueFrom/lastValueFrom 时,将重播 next() 和 complete() 调用。
主观意见:我认为这种行为令人困惑。从已经完成的源生成一个 Promise 应该会导致与 Promise.resolve() 相同的行为。此外,如果在 next() 和 complete() 之间调用 firstValueFrom/lastValueFrom,则结果行为并不那么明显。在使用 Promises 时,我们通常使用存在或不存在的单个值进行操作。所以我们用 undefined 解析的 toPromise() 的原始行为是一个更合乎逻辑的默认行为。
由于弃用而从 toPromise() 迁移到 firstValueFrom/lastValueFrom 时,我 运行 遇到了问题。 firstValueFrom/lastValueFrom 都不起作用,而 toPromise() 按预期工作。下面的示例代码显示了我的用例。这 3 个承诺都不会在 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();
问题是在 Observable 完成后调用了 firstValueFrom 方法。这对 toPromise() 来说不是问题,因为在这种情况下它不会产生任何错误。但是如果 Observable 在调用时已经完成,firstValueFrom/lastValueFrom 会产生错误。
我的解决方案是将 Subject 更改为 ReplaySubject,因此当调用 firstValueFrom/lastValueFrom 时,将重播 next() 和 complete() 调用。
主观意见:我认为这种行为令人困惑。从已经完成的源生成一个 Promise 应该会导致与 Promise.resolve() 相同的行为。此外,如果在 next() 和 complete() 之间调用 firstValueFrom/lastValueFrom,则结果行为并不那么明显。在使用 Promises 时,我们通常使用存在或不存在的单个值进行操作。所以我们用 undefined 解析的 toPromise() 的原始行为是一个更合乎逻辑的默认行为。