fromPromise中的RXJS抛出错误未命中'catchError'管道方法

时间:2018-04-16 21:15:09

标签: rxjs observable

有人可以解释为什么这个未能进入'catch'并抛出ErrorObservable的promise(runQuery)不会被'catchError'方法捕获,而是进入'map'方法。
(我尝试了两种_throw / ErrorObservable方法,结果相同)

import { _throw } from 'rxjs/observable/throw';
import { ErrorObservable } from 'rxjs/observable/ErrorObservable';

const runQuery = ( Promise that rejects )

const source$ = fromPromise(
  runQuery({ d: 'g' })
    .catch(err => {
      return new ErrorObservable(err);
      //return _throw(err); -- same as above
    })
  )
  .pipe(
    map((response: any) => {
      //ENTERS HERE as response.error     
    }),
    catchError(e => {
      //DOES NOT ENTER
    })
  );

2 个答案:

答案 0 :(得分:1)

您正在承诺中处理自己的错误,并让它返回fromPromise。通过这样做,你使承诺成功(尽管有一个像返回值这样的错误)。 {{1}}会将此转换为排放而非错误。

删除fromPromise中的catch案例,它应该点击Observable.catchError

答案 1 :(得分:0)

I made a live example to prove my point. 没有必要处理这个承诺(当它仍然是一个承诺时),所以这远非值得推荐。

.then(data => {
  return data;
})
.catch(err => {
  return new ErrorObservable(err);
  //return _throw(err); -- same as above
}))

让观察者控制拒绝

const source$ = fromPromise(runQuery())        
    .pipe(
        map((response: any) => {
            //Make here some transformations
            return response;     
        }),
        catchError(e => {
            return _throw(e);
        }
    ));