【问题标题】:Observable from Subject可从主题观察到
【发布时间】:2018-03-14 03:37:32
【问题描述】:

我正在尝试从 RX 主题的更新中创建操作

它正在工作,但我收到以下错误。

这是我的史诗

export function uploadSceneFile(action$, store) {
  return action$.ofType(CREATE_SCENE_SUCCESS)
    .mergeMap(({payload}) =>
      UploadSceneWithFile(payload)
        .subscribe(res => {
          if (res.progress > 0)
            store.dispatch(uploadSceneProgress(res))
          else if(res.progress === -1){
            store.dispatch(uploadSceneSuccess(res))
            requestSceneProcessing(res).map(res => {
            })
          }

        })
    )
}

这里是主题

export function UploadSceneWithFile(scene){

  const subject$ = new Subject()

  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}),
  })
  uploader.uploadFile(scene.file)

  return subject$
}

我从以前的帖子中读到,我应该使用 .map,而不是 .subscribe,但如果我不订阅,则不会发生任何事情(上传不会发生)

这样做的最佳方法是什么?

subscribeToResult.js:74 Uncaught TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    at Object.subscribeToResult (subscribeToResult.js:74)
    at MergeMapSubscriber../node_modules/rxjs/operators/mergeMap.js.MergeMapSubscriber._innerSub (mergeMap.js:132)
    at MergeMapSubscriber../node_modules/rxjs/operators/mergeMap.js.MergeMapSubscriber._tryNext (mergeMap.js:129)
    at MergeMapSubscriber../node_modules/rxjs/operators/mergeMap.js.MergeMapSubscriber._next (mergeMap.js:112)
    at MergeMapSubscriber../node_modules/rxjs/Subscriber.js.Subscriber.next (Subscriber.js:89)
    at FilterSubscriber../node_modules/rxjs/operators/filter.js.FilterSubscriber._next (filter.js:89)
    at FilterSubscriber../node_modules/rxjs/Subscriber.js.Subscriber.next (Subscriber.js:89)
    at Subject../node_modules/rxjs/Subject.js.Subject.next (Subject.js:55)
    at createEpicMiddleware.js:60
    at createEpicMiddleware.js:59
    at SafeSubscriber.dispatch [as _next] (applyMiddleware.js:35)
    at 

【问题讨论】:

  • 你在使用ngrx效果吗?

标签: rxjs observable ngrx


【解决方案1】:

问题是您在mergeMap 中订阅并返回一个无效的Subscription。回调只需要返回 Observable、Promise、Array 或 Iterable。

我不确定您究竟需要做什么,但如果您需要执行一些副作用,您可以使用 do() 运算符而不是订阅。

export function uploadSceneFile(action$, store) {
  return action$.ofType(CREATE_SCENE_SUCCESS)
    .mergeMap(({ payload }) => UploadSceneWithFile(payload)
      .do(res => {
        ...
      })
    )
}

或者看起来你也可以在 mergeMap 之后加上 do:

export function uploadSceneFile(action$, store) {
  return action$.ofType(CREATE_SCENE_SUCCESS)
    .mergeMap(({ payload }) => UploadSceneWithFile(payload))
    .do(res => {
      ...
    });
}

【讨论】:

    猜你喜欢
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2021-05-30
    相关资源
    最近更新 更多