我希望能够等待一个可观察的对象,例如
const source = Rx.Observable.create(/* ... */)
//...
await source;
天真的尝试导致等待立即解决而不是阻止执行
编辑:我的完整预期用例的伪代码是:
if (condition) {
await observable;
}
// a bunch of other code
我知道我可以将其他代码移到另一个单独的函数中并将其传递给订阅回调,但我希望能够避免这种情况。
我希望能够等待一个可观察的对象,例如
const source = Rx.Observable.create(/* ... */)
//...
await source;
天真的尝试导致等待立即解决而不是阻止执行
编辑:我的完整预期用例的伪代码是:
if (condition) {
await observable;
}
// a bunch of other code
我知道我可以将其他代码移到另一个单独的函数中并将其传递给订阅回调,但我希望能够避免这种情况。
您必须将Promise传递给await
. 将 observable 的下一个事件转换为 promise 并等待它。
if (condition) {
await observable.first().toPromise();
}
编辑说明:此答案最初使用 .take(1) 但已更改为使用 .first() 这避免了如果流在值通过之前结束则永远不会解决 Promise 的问题。
从 RxJS v8 开始,toPromise
将被删除。相反,上面可以替换为await firstValueFrom(observable)
使用新的firstValueFrom()
或lastValueFrom()
代替的toPromise()
,正如这里所指出的,从 RxJS 7 开始不推荐使用,并将在 RxJS 8 中删除。
import { firstValueFrom} from 'rxjs';
import { lastValueFrom } from 'rxjs';
this.myProp = await firstValueFrom(myObservable$);
this.myProp = await lastValueFrom(myObservable$);
这在 RxJS 7+ 中可用
请参阅:https : //indepth.dev/rxjs-heads-up-topromise-is-being-deprecated/
它可能必须是
await observable.first().toPromise();
正如之前评论中所指出的,当有空的已完成可观察对象时,take(1)
和first()
运算符之间存在重大差异。
Observable.empty().first().toPromise()
会导致拒收,EmptyError
表示可以相应处理,因为真的没有value。
而且Observable.empty().take(1).toPromise()
会导致分辨率undefined
值。
你需要await
一个Promise,所以你会想要使用toPromise()
. 有关更多详细信息,请参阅此内容toPromise()
。
编辑:
.toPromise()
现在在 RxJS 7 中被弃用(来源:https ://rxjs.dev/deprecations/to-promise )
新答案:
作为对已弃用的 toPromise() 方法的替代,您应该使用两个内置静态转换函数 firstValueFrom 或 lastValueFrom 之一。
例子:
import { interval, lastValueFrom } from 'rxjs';
import { take } from 'rxjs/operators';
async function execute() {
const source$ = interval(2000).pipe(take(10));
const finalNumber = await lastValueFrom(source$);
console.log(`The final number is ${finalNumber}`);
}
execute();
// Expected output:
// "The final number is 9"
旧答案:
如果toPromise
不推荐使用,您可以使用,.pipe(take(1)).toPromise
但正如您在此处看到的那样,它没有被弃用。
所以请使用toPromise
(RxJs 6) 说:
//return basic observable
const sample = val => Rx.Observable.of(val).delay(5000);
//convert basic observable to promise
const example = sample('First Example')
.toPromise()
//output: 'First Example'
.then(result => {
console.log('From Promise:', result);
});
异步/等待示例:
//return basic observable
const sample = val => Rx.Observable.of(val).delay(5000);
//convert basic observable to promise
const example = await sample('First Example').toPromise()
// output: 'First Example'
console.log('From Promise:', result);
在这里阅读更多。