Answers:
您必须向作出承诺await
。将可观察对象的下一个事件转换为承诺,然后等待。
if (condition) {
await observable.first().toPromise();
}
编辑说明:该答案最初使用.take(1),但更改为使用.first(),这避免了Promise永远不会解决的问题,如果流在值到达之前结束了。
await observable.first().toPromise();
吗?
first()
将导致拒绝,并 take(1)
导致未完成的承诺。
take(1)
也不应该使用first()
。因为您期望发生一个完全相同的事件,所以应该使用single()
,如果事件多于1,它将引发异常,而当事件不存在时不引发异常。如果不止一个,则您的代码/数据模型等中可能存在问题。如果不使用single,最终将随意选择返回的第一个项目,而不会警告有更多的项目。您必须谨慎对待上游数据源的谓词,以始终保持相同的顺序。
import 'rxjs/add/operator/first';
可能必须是
await observable.first().toPromise();
正如之前的评论所指出的,当空的完整可观测值时,take(1)
和first()
运算符之间存在实质性差异。
Observable.empty().first().toPromise()
会导致拒绝,EmptyError
因此可以进行相应处理,因为确实没有任何价值。
并Observable.empty().take(1).toPromise()
会带来undefined
有价值的解决方案。
take(1)
会不会产生一个悬而未决的承诺。它将产生一个由解决的承诺undefined
。
您将需要await
一个承诺,因此您将需要使用toPromise()
。见这对更多的细节toPromise()
。
如果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);
在这里阅读更多。
并请删除此错误的说法toPromise
,即已弃用。
.subscribe()
方法调用中?