我最近开始做一个新的项目,我已经看过两次了,我是疯了还是永远不会在任何情况下工作?
protected get reportView(): any {
let convertedView = null;
this.store
.pipe(select(fromStore.getTransferOrderConverted), rxjs.take(1))
.subscribe((convertedOrder) => (convertedView = convertedOrder));
return convertedView;
}发布于 2021-07-16 03:38:15
我是疯了还是在任何情况下都不会工作?
问:你疯了吗?
( A)是。绝对一点儿没错。看上去像疯了!
这在任何情况下都行不通吗?
哦,有时候这是可行的。一些观测值是同步的。
例如,这将始终记录一个2,因此这可以按照预期的方式工作。
let convertedView = null;
of(1).pipe(
map(v => v + 1)
).subscribe(convertedOrder => convertedView = convertedOrder);
console.log(convertedView);这是因为of(1)是同步可观测的。
然而,这是行不通的。
let convertedView = null;
of(1).pipe(
delay(0),
map(v => v + 1)
).subscribe(convertedOrder => convertedView = convertedOrder);
console.log(convertedView);这将打印null。尽管delay(0)概念上不需要时间,但它仍然使用JSs事件循环,因此在当前代码完成之前不会执行。
我认为最好的做法是假设所有observables都是异步的。任何假定不同的代码都可能是脆弱的。
发布于 2021-07-16 02:11:38
您的store.subscribe是异步的,而您的其余代码不是异步的。您可以通过承诺解决这个问题,如下面的示例所示。
protected get reportView(): Promise < any > {
return new Promise((resolve, reject) => {
this.store
.pipe(select(fromStore.getTransferOrderConverted), rxjs.take(1))
.subscribe((convertedOrder) => resolve(convertedOrder));
});
}
reportView.then(convertedOrder => {
// do your stuff
});此外,您还可以使用convertedOrder获得异步/等待。但是请记住,父函数必须是async。
const convertedOrder = await reportView();发布于 2021-07-16 02:57:31
将流转换为同步不是一个好的理想。但是,您可以使用subject (订阅)的方法toPromise将其转换为承诺并等待解决。
https://stackoverflow.com/questions/68402420
复制相似问题