8

我的应用有 3 个下载按钮 每个按钮单击都会调度DownloadFileAction(payload=fileId) 一个 Effect 将继续监听 Download_File_Action 类型

@effect()
download_attachment$: Observable = this.actions$
.ofType(FileActions.ActionTypes.DOWNLOAD_ATTACHMENT)
.map(toPayload)
.switchMap( attachment => {
return this.service.downloadAttachment(attachment.link) //absolute link
.map( (data) => {
this.service.saveAttachment(data); //save file locally
return new FileActions.DownloadAttachmentSuccessAction(attachment);
})
.catch(error => {
//debugger;
console.log(error);
});

})

如果同时点击了 1 个以上的按钮,则会分派 2 个 DownloadFileAction 动作

但是,download_attachment$ effect 只监听一个先下载的,然后返回 DownloadAttachmentSuccessAction,所以其他的下载文件不会完成

有什么解决方案或解决方法吗?非常感谢您的想法

4

1 回答 1

12

正如@cartant 在评论中提到的,替换switchMapmergeMap.

不同之处在于,每次父可观察对象触发时switchMap都会切换mergeMap上下文,并将继续侦听父可观察对象并合并或组合结果。

切换地图

本质上,switchMap当父 observable 发出一个新值时,它取消订阅父 observable 的第一个流。

在此处输入图像描述

在弹珠图中,您可以看到何时3发出然后5发出,最终输出不包括 330秒,因为何时5发出,它切换了上下文并丢弃了值。

合并图

MergeMap 将合并从父 observable 发出的所有值。

在此处输入图像描述

在弹珠图中,mergeMap您可以看到父可观察对象发出的每个值都发出了所有值。即,所有30s 都会被发射,即使最后一个值是在5从父级发射之后出现的。

希望这有助于更好地说明它。

于 2017-05-12T12:10:48.603 回答