如何在订阅前等待 Observable 完成
Posted
技术标签:
【中文标题】如何在订阅前等待 Observable 完成【英文标题】:How to Wait the Observable to Finish Before the Subscribe 【发布时间】:2018-09-05 11:34:53 【问题描述】:我编写了 RXJS 运算符来获取位置数组。
这是我的代码:
return O$ = this.db.list(`UserPlaces/$this.authData.auth.auth.currentUser.uid`,
query:
orderByChild: 'deleted',
equalTo: false
)
.map((locations: any) =>
return locations.map(location =>
return location.$key;
);
).switchMap(ids =>
return ids.map(id =>
return this.db.object(`Devices/$id`)
);
)
.flatMap((x: any) =>
return x;
)
.map((x:any)=>
if(!x.deleted)
return x;
)
.scan((acc:any, item) => [...acc, item],[])
.do(console.log)
给定的数组按顺序填充:
[] --> [,] --> [,,] --> [,,,,...]
我需要的是直接获取完整的数组:
[,,,,...]
我尝试使用 forkJoin 但不起作用:
return Observable.forJoin(O$) //but doesn't work.
任何帮助解决这个问题?
谢谢。
【问题讨论】:
好吧,问题是如果源永远不会完成,你怎么知道你什么时候想要发出数组。可能是[,]
还是[,, ]
?也许你可以使用auditTime()
? reactivex.io/rxjs/class/es6/…
【参考方案1】:
您使用subscribe
方法的全部功能订阅它,并等待complete
回调被调用或抛出错误:
const o$ = (...) // your final observable
let array = null;
o$.subscribe(
next: value => array = value,
complete: () =>
// the operation behind the observable completed. No more values
// will be yielded. 'array' contains the final values
,
error: (error) =>
// there was an error. No more values will be yielded
);
【讨论】:
感谢您的回复,我在使用您的方式后订阅根本不起作用,在完整和错误阶段 哪个订阅不起作用?我不明白。你已经订阅了 observable?在您的代码中,我没有看到任何订阅。 在写完你的方式之后,我在完整部分中记录了数组,没有出现,我在错误阶段记录了错误,没有出现 你能把订阅observable的代码贴出来吗?【参考方案2】:将 .scan 改为 reduce()
.map((x:any)=>
if(!x.deleted)
return x;
)
.reduce((acc:any, item) =>
acc.push(item)
return acc
,[])
【讨论】:
感谢您的回复,我使用了reduce op后。订阅不起作用 也许将 do() 移到上线调试 reduce 不会发出任何东西,因为源 observable 没有完成。 forkJoin 也是如此。在此之前,您必须完成您的源 observable。 是的,我假设它会完成。我们需要了解更多关于 db api 的信息以上是关于如何在订阅前等待 Observable 完成的主要内容,如果未能解决你的问题,请参考以下文章
Redux-observable:当动作完成时组件如何订阅响应?