RxJS主题科目

时间:2018-07-30 02:49:34

标签: rxjs redux-thunk subject-observer

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

{{1}}

文件似乎确实正在下载等。我可以控制台记录进度-尝试映射结果时,什么都不会触发。

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

2 个答案:

答案 0 :(得分:1)

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

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 :(得分:0)

我最终只做了一个主题,就把它退了

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}) )
  })
}