RXJS Подписаться на тему - Действия должны быть простыми объектами.Использовать пользовательское промежуточное ПО для асинхронных действий - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь подписаться на тему.Это работает, как и ожидалось в первый раз, но выдает вышеуказанную ошибку во второй раз, и я не вижу, где это исправить.

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) => subject $ .next ({... scene, progress: 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 голосов
/ 23 мая 2018

Во внутреннем map в вашем uploadSceneFile у вас есть оператор if, за которым следует оператор else if, если ни один из них не равен true, map вернет undefined вместоaction.

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

Обратите внимание, что при выполнении действия undefined проверка , которую Redux выполняет , чтобы определить, является ли действие простым объектом, повлияет на вашу ошибкувидя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...