首页 > 解决方案 > Observable 中的 RxJs 包装函数

问题描述

我有一个问题,你如何在 observable 中包装一个普通的同步代码。让我们看这个例子:

let isCalling = false;

function makeHttpCall(url) {
  isCalling = true;

  return rxJsFetch(url).pipe(tap(() => (isCalling = false)));
}

该功能的问题是,isCalling无论是否有人订阅,都会设置标志。我不想要那个(因为它还没有调用)。为了解决这个问题,我通常会做类似的事情:

let isCalling = false;

function makeHttpCallWrapped(url) {
  return of(null).pipe(
    mergeMap(() => {
      isCalling = true;

      return rxJsFetch(url).pipe(tap(() => (isCalling = false)));
    }),
  );
}

这有效,isCalling仅在订阅后设置。


该代码的问题在于它不是很优雅,对于从 RxJs 开始的人来说也不是很清楚。我对你的问题是,你如何处理它?RxJs 中是否有一些我不知道的东西可以更优雅地处理它?

标签: rxjs

解决方案


RxJS 延迟运算符

Defer 允许您在订阅时创建一个 observable。这正是您已经在做的更清洁的版本。

let isCalling = false;

function makeHttpCall(url) {
  return defer(() => {
    isCalling = true;

    return rxJsFetch(url).pipe(tap(() => (isCalling = false)));
  });
}

推荐阅读