Comments (4)
Thank feedback. We will check it later:-)
from remesh.
可以将 downloader
封装成 rxjs
的 Observable
内部管理 cancel
逻辑.
大概像下面这样处理:
import { Observable, takeUntil, switchMap } from 'rxjs'
type DownloadState = {
type: 'progress'
progress: number
} | {
type: 'error'
error: string
} | {
type: 'success'
file: Blob
}
const download = (url: string) => {
return new Observable<DownloadState>(subscriber => {
const downloadId = downloader.startDownload(url, {
onProgress: (progress) => {
subscriber.next({ type: 'progress', progress })
},
onFinish: (file: Blob) => {
subscriber.next({ type: 'success', file })
subscriber.complete()
},
onFailed: (message: string) => {
subscriber.next({ type: 'error', error: message })
subscriber.complete()
},
})
const unsubscribe = () => {
downloader.cancelDownload(downloadId)
}
return unsubscribe
})
}
domain.effect({
name: 'DownloadEffect',
impl: ({ fromEvent }) => {
return fromEvent(DownloadStartedEvent).pipe(
switchMap(event => {
// cancel download if user cancels it
return download(event.url).pipe(
takeUntil(fromEvent(DownloadCancelledEvent)),
)
}),
map(state => {
switch (state.type) {
case 'progress':
return DownloadProgressEvent(state.progress)
case 'error':
return DownloadFailedEvent(state.error)
case 'success':
return DownloadFinishedEvent(state.file)
}
})
)
}
})
from remesh.
可以将
downloader
封装成rxjs
的Observable
内部管理cancel
逻辑.大概像下面这样处理:
import { Observable, takeUntil, switchMap } from 'rxjs' type DownloadState = { type: 'progress' progress: number } | { type: 'error' error: string } | { type: 'success' file: Blob } const download = (url: string) => { return new Observable<DownloadState>(subscriber => { const downloadId = downloader.startDownload(url, { onProgress: (progress) => { subscriber.next({ type: 'progress', progress }) }, onFinish: (file: Blob) => { subscriber.next({ type: 'success', file }) subscriber.complete() }, onFailed: (message: string) => { subscriber.next({ type: 'error', error: message }) subscriber.complete() }, }) const unsubscribe = () => { downloader.cancelDownload(downloadId) } return unsubscribe }) } domain.effect({ name: 'DownloadEffect', impl: ({ fromEvent }) => { return fromEvent(DownloadStartedEvent).pipe( switchMap(event => { // cancel download if user cancels it return download(event.url).pipe( takeUntil(fromEvent(DownloadCancelledEvent)), ) }), map(state => { switch (state.type) { case 'progress': return DownloadProgressEvent(state.progress) case 'error': return DownloadFailedEvent(state.error) case 'success': return DownloadFinishedEvent(state.file) } }) ) } })
感谢! 太优雅了!
from remesh.
如果要支持同时下载很多个,可以将 switchMap
替换成 mergeMap
,并且根据 DownloadCancelledEvent
携带的 url 进行过滤。以及拓展 DownloadState
使之携带 url
等数据
大概像下面这样:
domain.effect({
name: 'DownloadEffect',
impl: ({ fromEvent }) => {
return fromEvent(DownloadStartedEvent).pipe(
// for each download event, create a stream of progress events
// merge them together instead of switching
mergeMap(event => {
// create a stream of cancel events for this download
const cancel$ = fromEvent(DownloadCancelledEvent).pipe(
filter(cancelledEvent => cancelledEvent.url === event.url)
)
// cancel download if user cancels it
return download(event.url).pipe(takeUntil(cancel$))
}),
map(state => {
switch (state.type) {
case 'progress':
return DownloadProgressEvent(state)
case 'error':
return DownloadFailedEvent(state)
case 'success':
return DownloadFinishedEvent(state)
}
})
)
}
})
from remesh.
Related Issues (20)
- 一个Query 使用useRemeshQuery和effect fromQuery同时订阅,effect的订阅会失效 HOT 8
- remesh4.0.0更新使用react useSyncExternalStore,导致无法正常使用remesh包。 HOT 2
- remesh如何在vue2.6中使用 HOT 5
- npm 包中的github链接错误 HOT 2
- remesh 一定需要搭配rxjs使用吗? HOT 1
- vue 2.7.14 中 使用remesh-vue报错app.provide为undefined HOT 1
- remesh在逻辑分离的同时怎么考虑到和UI同步的情况呢 HOT 5
- 可以实现多实例吗 HOT 8
- feat Serializable 支持 readonly HOT 4
- 中文文档有误 HOT 3
- 要是有个交流群或者discord就好了 HOT 6
- StorageExtern Type error HOT 2
- Remesh.domain 如何接收泛型 HOT 1
- 组件内部Query和Update一个状态,每次重新打开组件的时候,Query对应的State又被初始化为默认值了 HOT 3
- query的类型没有自推倒,那类型如何定义? HOT 8
- Module not found: Error: Can't resolve 'use-sync-external-store/shim' in '/project/remesh-example/node_modules/remesh-react/esm' HOT 1
- ListModule 暴露 event 的必要性? HOT 3
- clearDomainStorageIfNeeded 清理之前可以有一个保留时间吗 HOT 3
- StartedEvent effect 依赖于 dom 的挂载, dom 的挂载依赖于 StartedEvent 应该怎么实现呢 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from remesh.