RXJS订阅主题 - 动作必须是普通对象。使用自定义中间件进行异步操作

时间:2018-05-22 22:01:45

标签: redux rxjs

我正在尝试订阅某个主题。这是第一次按预期工作,但第二次抛出上述错误,我看不到在哪里修复它。

export function uploadSceneFile(action$, store) {
  return action$.ofType(CREATE_SCENE_SUCCESS)
    .mergeMap(({payload}) =>
      UploadSceneWithFile(payload)
        .map(res => {
          if (res.progress > 0){
              return { type: UPLOAD_SCENE_PROGRESS, scene: res }
          }
          else if(res.progress === -1){
              return { type: UPLOAD_SCENE_SUCCESS, scene: res }
          }
        })
    )
}

它旨在侦听正在创建的情景,发送上传进度通知,然后发送成功消息。

第二次运行时,错误会直接从此行抛出

  

onProgress:(val)=>受试者$的.next({...场景,进展:VAL}),

export function UploadSceneWithFile(scene){

  const subject$ = new Subject()

  scene.filename = scene.file.name
  scene.type = scene.file.type.match('image') ? 0 : 1

    FileToScenePreview(scene).then(res => {
    scene.thumbName = res.thumbName
  })

  const uploader = new S3Upload({
    getSignedUrl: getSignedUrl,
    uploadRequestHeaders: {'x-amz-acl': 'public-read'},
    contentType: scene.file.type,
    contentDisposition: 'auto',
    s3path: 'assets/',
    onError:()=>subject$.next('error'),
    onProgress: (val)=> subject$.next({...scene,progress:val}),
    onFinishS3Put: ()=> {
      subject$.next({...scene,progress:-1})
      subject$.complete()
    },
  })
  uploader.uploadFile(scene.file)

  return subject$.asObservable()
}

错误消息

   Subscriber.js:242 Uncaught Error: Actions must be plain objects. Use custom middleware for async actions.
    at Object.performAction (<anonymous>:1:40841)
    at liftAction (<anonymous>:1:34377)
    at dispatch (<anonymous>:1:38408)
    at createEpicMiddleware.js:59
    at createEpicMiddleware.js:59
    at SafeSubscriber.dispatch [as _next] (applyMiddleware.js:35)
    at SafeSubscriber../node_modules/rxjs/Subscriber.js.SafeSubscriber.__tryOrUnsub (Subscriber.js:238)
    at SafeSubscriber../node_modules/rxjs/Subscriber.js.SafeSubscriber.next (Subscriber.js:185)
    at Subscriber../node_modules/rxjs/Subscriber.js.Subscriber._next (Subscriber.js:125)
    at Subscriber../node_modules/rxjs/Subscriber.js.Subscriber.next (Subscriber.js:89)
    at SwitchMapSubscriber../node_modules/rxjs/operators/switchMap.js.SwitchMapSubscriber.notifyNext (switchMap.js:126)
    at InnerSubscriber../node_modules/rxjs/InnerSubscriber.js.InnerSubscriber._next (InnerSubscriber.js:23)
    at InnerSubscriber../node_modules/rxjs/Subscriber.js.Subscriber.next (Subscriber.js:89)
    at MergeMapSubscriber../node_modules/rxjs/operators/mergeMap.js.MergeMapSubscriber.notifyNext (mergeMap.js:145)
    at InnerSubscriber../node_modules/rxjs/InnerSubscriber.js.InnerSubscriber._next (InnerSubscriber.js:23)
    at InnerSubscriber../node_modules/rxjs/Subscriber.js.Subscriber.next (Subscriber.js:89)
    at MergeMapSubscriber../node_modules/rxjs/operators/mergeMap.js.MergeMapSubscriber.notifyNext (mergeMap.js:145)
    at InnerSubscriber../node_modules/rxjs/InnerSubscriber.js.InnerSubscriber._next (InnerSubscriber.js:23)
    at InnerSubscriber../node_modules/rxjs/Subscriber.js.Subscriber.next (Subscriber.js:89)
    at MapSubscriber../node_modules/rxjs/operators/map.js.MapSubscriber._next (map.js:85)
    at MapSubscriber../node_modules/rxjs/Subscriber.js.Subscriber.next (Subscriber.js:89)
    at Subject../node_modules/rxjs/Subject.js.Subject.next (Subject.js:55)
    at S3Upload.onProgress (uploadSceneFile.js:27)
    at S3Upload.<anonymous> (s3upload.js:139)

1 个答案:

答案 0 :(得分:1)

map内的uploadSceneFile内,您有if语句,后跟else if语句,如果两者都不是true,则{ {1}}将返回map而不是操作。

undefined

请注意,在传递.map(res => { if (res.progress > 0){ return { type: UPLOAD_SCENE_PROGRESS, scene: res } } else if(res.progress === -1){ return { type: UPLOAD_SCENE_SUCCESS, scene: res } } // An action should be returned here! }) 操作时,check that Redux performs确定操作是否为普通对象会影响您看到的错误。

相关问题