【发布时间】:2020-06-04 19:32:32
【问题描述】:
现在有一个数组,数组值就是图片链接,例如:
const imageList = [
'https://cdn.pixabay.com/photo/2020/02/16/20/29/new-york-4854718_960_720.jpg',
'https://cdn.pixabay.com/photo/2020/02/14/16/04/mallorca-4848741_960_720.jpg',
'https://cdn.pixabay.com/photo/2020/02/14/04/20/old-city-4847469_960_720.jpg',
// more...
];
我想用rxjs依次下载(我是Electron应用,所以可以下载)
当第一张图片下载完成后,再下载第二张图片。在下载第三张图片时,用户点击暂停按钮,等待第三张图片下载完成。然后不再下载。当用户点击继续按钮时,从第四张图片开始下载。
我参考这篇文章:https://medium.com/@kddsky/pauseable-observables-in-rxjs-58ce2b8c7dfd中的Buffering (lossless)部分。本文代码为:
merge(
source$.pipe( bufferToggle(off$, ()=>on$) ),
source$.pipe( windowToggle(on$, ()=>off$) )
).pipe(
// then flatten buffer arrays and window Observables
flatMap(x => x)
)
演示网址为:https://thinkrx.io/gist/cef1572743cbf3f46105ec2ba56228cd
但是这段代码有两个问题,不符合我的需求。不知道怎么修改。
- 我使用
redux-observable,所以我想用两个动作来触发它们:(this.props.start()/this.props.pause()) - 恢复后,数据仍然是一个一个传输,不是一次性释放
当前代码如下所示:
export const epicDownloadResources = (
action$: ActionsObservable<AnyAction>,
store$: StateObservable<RootState>,
) => {
return action$.pipe(
ofType(appActions.other.start()),
of([
'https://cdn.pixabay.com/photo/2020/02/16/20/29/new-york-4854718_960_720.jpg',
'https://cdn.pixabay.com/photo/2020/02/14/16/04/mallorca-4848741_960_720.jpg',
'https://cdn.pixabay.com/photo/2020/02/14/04/20/old-city-4847469_960_720.jpg',
]),
mergeMap(() => {
// code
}),
mergeMap((url: string) => {
// downloading
})
}
在真实产品中,会下载公司内部图片资源,而不是其他无版权的图片。
【问题讨论】:
标签: reactjs redux rxjs rxjs6 redux-observable