Ngrx 一次分派一个动作多次
Ngrx dispatch one action multiple times at once
我的应用程序有 3 个下载按钮
每次单击按钮都会调度 DownloadFileAction(payload=fileId)
Effect 将继续监听 Download_File_Action type
@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$效果只监听先下载一个然后returnDownloadAttachmentSuccessAction,因此其他下载文件不会完成
是否有任何解决方案或解决方法?
非常感谢您的想法
正如@cartant 在评论中提到的那样,将 switchMap
替换为 mergeMap
。
不同之处在于,switchMap
将 切换 上下文,每次父 observable 触发并且 mergeMap
将继续监听父 observable 并且 合并或合并结果。
开关地图
本质上,当父 Observable 发出新值时,switchMap
取消订阅父 Observable 的第一个流。
在弹珠图中,可以看到什么时候发出了3
,然后发出了5
,最后的输出不包括3个30
,因为当[=16] =] 被发出,它 切换 上下文并且值被删除。
MergeMap
MergeMap 将合并从父 observable 发出的所有值。
在 mergeMap
的弹珠图中,您可以看到从父 Observable 发出的每个值都会发出所有值。即,所有 30
都会发出,即使最后一个值在 5
之后从父项发出。
希望这有助于更好地说明它。
我的应用程序有 3 个下载按钮 每次单击按钮都会调度 DownloadFileAction(payload=fileId) Effect 将继续监听 Download_File_Action type
@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$效果只监听先下载一个然后returnDownloadAttachmentSuccessAction,因此其他下载文件不会完成
是否有任何解决方案或解决方法? 非常感谢您的想法
正如@cartant 在评论中提到的那样,将 switchMap
替换为 mergeMap
。
不同之处在于,switchMap
将 切换 上下文,每次父 observable 触发并且 mergeMap
将继续监听父 observable 并且 合并或合并结果。
开关地图
本质上,当父 Observable 发出新值时,switchMap
取消订阅父 Observable 的第一个流。
在弹珠图中,可以看到什么时候发出了3
,然后发出了5
,最后的输出不包括3个30
,因为当[=16] =] 被发出,它 切换 上下文并且值被删除。
MergeMap
MergeMap 将合并从父 observable 发出的所有值。
在 mergeMap
的弹珠图中,您可以看到从父 Observable 发出的每个值都会发出所有值。即,所有 30
都会发出,即使最后一个值在 5
之后从父项发出。
希望这有助于更好地说明它。