我有一种情况,我可能需要也可能不需要将可观察对象添加到列表中。然后我想 forkJoin
我拥有的可观察对象,以便在所有数据可用后加载页面。
let observables: Observable<any>[] = [];
observables.push(this.taskService.getStep(this.housingTransactionId, this.task.stageReferenceId, this.task.stepReferenceId));
if (this.task.associatedChatThreadId) {
observables.push(this.messageHubService.getChatThread(this.housingTransactionId, this.task.associatedChatThreadId));
}
if (this.task.associatedDocuments && this.task.associatedDocuments.length > 0) {
this.task.associatedDocuments.forEach(documentId => {
observables.push(this.documentHubService.getDocumentProperties(this.housingTransactionId, documentId));
});
}
Observable.forkJoin(observables)
.subscribe(([step, chatThread, ...documents]) => {
this.step = step;
this.chatThread = chatThread;
this.documents = documents;
this.isPageLoading = false;
}, error => {
this.isPageLoading = false;
console.log(error);
});
我遇到的问题是,如果我没有 this.task.associatedChatThreadId
,则 observable 不会添加到列表中,并且当 forkJoin
执行后,...documents
位于订阅方法中 chatThread
属性的位置(嗯,第一个文档!)。
有没有办法确保来自 forkJoin
的响应的定位?或者我应该/我可以使用不同的方法吗?
最佳答案
如果不满足条件,您可以很容易地添加一个带有 null
值的哑 Observable.of(null)
以保持相同的响应顺序:
if (this.task.associatedChatThreadId) {
observables.push(this.messageHubService....);
} else {
observables.push(Observable.of(null))
}
然后在订阅中你可以检查 chatThread === null
因为它总是出现在相同的位置。
或者,你可以用一些额外的对象将每个 Observable 包装在 observables
中,这将使它在订阅者中唯一可识别,但这样做会不必要地复杂,所以我个人坚持第一个选项。
关于javascript - 使用 forkJoin 的条件可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52297422/