首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主题的RxJS主题

主题的RxJS主题
EN

Stack Overflow用户
提问于 2018-07-30 10:49:34
回答 2查看 88关注 0票数 0

我正在尝试创建一个下载资产列表的主题,该列表为每个资产发送操作,如果可能的话,使用主题主题?

代码语言:javascript
复制
   export function onDownloadGuide(action$,store){
  return action$.ofType(DOWNLOAD_GUIDE)
    .mergeMap(() => downloadGuideAssets().map(res => downloadGuideAssetProgress(res)))
}

function downloadGuideAssets(){
  const subject$ = new Subject()
  getAssetList().map((asset) => downloadAsset(asset).map(res => {console.log(res);subject$.next(res)}))
  return subject$.asObservable()
}

function downloadAsset({id,src}){

  const subject$ = new Subject()

  window.resolveLocalFileSystemURL(cordova.file.dataDirectory, dirEntry => {
    dirEntry.getFile(src.substring(src.lastIndexOf('/')+1),{create:true, exclusive:true}, f => {
      fetch(src).then(fetchProgress({onProgress(progress) {console.log('progressevent');subject$.next({id,progress})}}))
        .then(res => res.blob())
        .then(blob =>
          f.createWriter(writer => {
            writer.onwriteend = ()=> subject$.next({id,complete:true})
            writer.write(blob)
          }))
        .catch(err => subject$.next({id,error:err}))

    }, err => subject$.next({id,error:err}) )
  })

  return subject$.asObservable()
}

文件似乎正在下载等。我可以控制台记录进度-只是当我尝试并映射结果时,没有任何东西被触发。

这是因为我从订阅开始吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-30 13:21:29

它可以像下面这样进一步简化,并像使用downloadGuideAssets().subscribe()一样使用它,您实际上不需要主题

代码语言:javascript
复制
function downloadGuideAssets(){
  return getAssetList().map((asset) => downloadAsset(asset))
}

function downloadAsset({id,src}){
return Observable.create(obs=>{
  window.resolveLocalFileSystemURL(cordova.file.dataDirectory, dirEntry => {
    dirEntry.getFile(src.substring(src.lastIndexOf('/')+1),{create:true, exclusive:false}, f => {
      fetch(src).then(fetchProgress({onProgress(progress) {subject$.next({id,progress})}}))
        .then(res => res.blob())
        .then(blob =>
          f.createWriter(writer => {
            writer.onwriteend = ()=> obs.next({id,complete:true})
            writer.write(blob)
          }))
        .catch(err => obs.error({id,error:err}))
    }, err => obs.error({id,error:err}) )
  })
})
}
票数 1
EN

Stack Overflow用户

发布于 2018-07-30 12:32:13

我最后做了一个主题,并返回了

代码语言:javascript
复制
function downloadGuideAssets(){
  const subject$ = new Subject()
  getAssetList().map((asset) => downloadAsset(asset,subject$))
  return subject$.asObservable()
}

function downloadAsset({id,src},subject$){

  window.resolveLocalFileSystemURL(cordova.file.dataDirectory, dirEntry => {
    dirEntry.getFile(src.substring(src.lastIndexOf('/')+1),{create:true, exclusive:false}, f => {
      fetch(src).then(fetchProgress({onProgress(progress) {subject$.next({id,progress})}}))
        .then(res => res.blob())
        .then(blob =>
          f.createWriter(writer => {
            writer.onwriteend = ()=> subject$.next({id,complete:true})
            writer.write(blob)
          }))
        .catch(err => subject$.next({id,error:err}))
    }, err => subject$.next({id,error:err}) )
  })
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51586410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档