【问题标题】:How to throw stream error in custom operator?如何在自定义运算符中引发流错误?
【发布时间】:2018-07-27 15:40:39
【问题描述】:

我找到了我想使用的 cstom 运算符。

这是一个重试 http 请求的操作符。代码来自 Stephen Fluin:https://github.com/StephenFluin/http-operators/blob/master/operators/retryExponentialBackoff.operator.ts

问题是,如果在所有这些 reties 之后它没有将错误放入流中,则只会完成。 我希望它抛出一个错误。怎么做? 我认为这部分应该修改:

     error(err: any) {
        if (count <= maxTries) {
          subscription.add(scheduler.schedule(subscribe, initialWait * Math.pow(2, count++)));
        }
      },

这是整个算子的类

/**
 * Repeats underlying observable on a timer
 *
 * @param maxTries The maximum number of attempts to make, or -1 for unlimited
 * @param initialWait Number of seconds to wait for refresh
 */
export const retryExponentialBackoff = (
  maxTries = -1,
  initialWait = 1,
  scheduler: SchedulerLike = asyncScheduler
) => <T>(
  source: Observable<T>
) => {
  return new Observable<T>(subscriber => {
    let count = 1;
    const subscription = new Subscription();

    const subscribe = () =>
      subscription.add(
        source.subscribe({
          next(value: T) {
            count = 1;
            subscriber.next(value);
          },
          error(err: any) {
            if (count <= maxTries) {
              subscription.add(scheduler.schedule(subscribe, initialWait * Math.pow(2, count++)));
            }
          },
          complete() {
            subscriber.complete();
          },
        })
      );

    subscribe();

    return subscription;
  });
};

【问题讨论】:

    标签: rxjs rxjs6


    【解决方案1】:

    我会尝试像这样向订阅者添加冒泡错误:

    error(err: any) {
      if (count <= maxTries) {
        subscription.add(scheduler.schedule(subscribe, initialWait * Math.pow(2, count++)));
      }
      else {
        subscriber.error(err);
      }
    },
    

    这样,在您的 maxTries 计数用完后,错误就会向下游发出。

    【讨论】:

      猜你喜欢
      • 2022-07-06
      • 1970-01-01
      • 2023-01-07
      • 2020-06-27
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 2014-11-29
      相关资源
      最近更新 更多