捕获Promise,Observable.fromPromise()和subscribtion中的错误

时间:2018-01-16 11:51:36

标签: node.js promise rxjs try-catch

长话短说:我不确定应该从fromPromise()。catch()方法中捕获哪种错误,以及在onError(错误:错误)观察者方法中应该解决哪些错误。

我将node.js与rxjs一起使用,这就是我将我的承诺转换为可观察数据的原因。

看一下经典的Promise定义

const getPromise = (target) => {
    return new Promise((resolve, reject) => {
        request(
            {
                url: url,
                json: true
            },
            (error, response, body) => {
                if (error) {
                    reject({
                        id: id,
                        error: error,
                        response: response,
                        body: body
                    });
                } else {
                    resolve({
                        id: id,
                        body: body
                    });
                }
            }
        );
    });
};

我在循环中转换我的承诺并返回可观察数组

const observableItems = [];
targetList.forEach((target) => {
  const observableItem = {
    id: target.id,
    observable$: rx.Observable
      .fromPromise(getPromise(target))
      .catch((error) => {
        // [1]
        return rx.Observable.of(error);
      })
  };
  observableItems.push(observableItem);
});

return observableItems;

然后我订阅了我的observables

observableItems.forEach((observableItem) => {
  const currentSubscribtion = observableItem.observable$.subscribe(
    (payload) => {
      if (payload && payload.error) {
        handleInvalidPayload(payload);
      } else {
        handleValidPayload(payload);
      }
    },
    (error) => {
      // [2]
    }
  );
  subscribtions.push(currentSubscribtion);
});

我的问题:

1 /是否可以从[1]中抛出错误并将其直接传递给[2]点?这时我在onNext()中得到if语句 - 我不喜欢它。

我尝试在catch()方法中使用return Observable.throw(someObject)而没有任何成功。

2 /应该在catch()和OnError()方法中解决哪种错误?

我用404这样的代码询问连接超时,ENOTFOUND和后端错误?

1 个答案:

答案 0 :(得分:1)

catch运算符的目的是处理上游错误并将所需的值替换为observer::next(或者在需要时重新抛出)。

适用于

等案件
  

是否可以从[1]中抛出错误并将其直接传递给[2]点?

,您似乎想直接处理错误观察器​​中的错误。这意味着您不需要catch它,拒绝抛出错误观察者。考虑简单的代码片段立即拒绝

const p = new Promise((res, rej) => rej(0));

Rx.Observable.fromPromise(p)
  .subscribe((x) => {}, (e) => console.log(e)); //0

下一个观察者将不会被召唤。

如上所述,catch运算符提供了根据需要替换错误的机制。说你被拒绝的值是你想要内部处理并向前传递的东西,然后你可以将一些值返回给观察者。这取决于你想要处理的错误的性质,如果你想终止具有错误条件的可观察流,你可能不需要捕获它。