【问题标题】:Catching errors in Promise, Observable.fromPromise() and subscribtion在 Promise、Observable.fromPromise() 和订阅中捕获错误
【发布时间】:2018-06-25 02:58:59
【问题描述】:

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

我将 node.js 与 rxjs 一起使用,这就是我将 Promise 转换为 observables 的原因。

看看经典的 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() 方法中应该解决什么样的错误?

我问的是连接超时、ENOTFOUND 和后端错误,代码如 404?

【问题讨论】:

  • 如果您不处理/转换任何内容,只需完全省略 catch

标签: node.js promise rxjs try-catch


【解决方案1】:

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

对于像

这样的情况

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

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

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

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

不会调用下一个观察者。

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

【讨论】:

    猜你喜欢
    • 2019-08-19
    • 2021-11-27
    • 2015-07-21
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2021-04-21
    • 2017-05-06
    • 1970-01-01
    相关资源
    最近更新 更多