javascript - 使用 forkJoin 的条件可观察对象

标签 javascript angular typescript rxjs observable

我有一种情况,我可能需要也可能不需要将可观察对象添加到列表中。然后我想 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/

相关文章:

Angular 使用带有转义元素属性的 innerHTML

javascript - Angular 5 所需的表单字段不适用于 Material

javascript - 将 php 2d 数组传递给 Javascript 并尝试使用 json_encode() 进行解析时会抛出未捕获的类型错误

angular - 粘性标题没有事件使用 Angular 在内容上滚动

javascript - 函数执行次数超过预期

angular - 如何在 JSP 页面中包含 angular2/4 组件?

TypeScript 接口(interface)实现不检查方法参数

javascript - 使用没有路径的 require() 函数

javascript - 创建没有主/详细信息的 Kendo UI 层次结构网格

javascript - 我可以动态更改 ionic 选项卡根目录吗?