angular - Ngrx 一次分派(dispatch)一个 Action 多次

标签 angular redux ngrx ngrx-effects ngrx-store

我的应用有 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 Action

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

是否有任何解决方案或解决方法? 非常感谢您的想法

最佳答案

正如@cartant 在评论中提到的那样,将 switchMap 替换为 mergeMap

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

开关图

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

enter image description here

在弹珠图中,可以看到当3发出,然后发出5,最后的输出不包括3 30s 因为当发出 5 时,它切换上下文并且值被丢弃。

合并 map

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

enter image description here

mergeMap 的大理石图中,您可以看到从父可观察对象发出的每个值都会发出所有值。即,所有 30 都会发出,即使最后一个值在 5 之后从父级发出也是如此。

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

关于angular - Ngrx 一次分派(dispatch)一个 Action 多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43936865/

相关文章:

css - 控制 mat-chip 的高度

angular - ngrx更新数组内的对象

angular ngrx-store-localstorage 在重新加载后不存储数据

reactjs - 复选框状态不会根据 redux 状态而改变

NGRX - 结合选择器和 Prop

angular - 使用 mutate() 时,为什么 Angular 信号不运行我的自定义 'equal' 检查?

angular - 无法找到模块 './sections/lazy/lazy.module.ngfactory' Angular 2 Webpack + AOT 设置中出现错误

unit-testing - 使用 jasmine 进行 Angular2 异步单元测试

react-native - Redux reducer 没有更新 immutable.js Redux 存储

javascript - 组件未更新(react-redux)