【问题标题】:RXJS sequence for multiple observables用于多个可观察对象的 RXJS 序列
【发布时间】:2016-09-21 01:01:56
【问题描述】:

我正试图围绕 RXJS 进行思考,并有一个关于如何使用 observables 而不是 Promise 来处理以下工作流的快速问题。

这是 Angular 2 中的登录工作流程:

  • 我在本地存储中查找 JWT。如果 JWT 存在,我会返回令牌。
  • 如果不在本地存储中,我会检查平台。如果 Android 我使用谷歌不记名令牌登录到我的服务器,我的服务器会返回一个 JWT(通过 angular HTTP obserable)。
  • 如果不在本地存储中并且平台是 Windows 计算机,我会在我的服务器上生成 JWT 并返回(通过 Angular HTTP obserable)
  • 对于对服务器的两次调用,我想在将 JWT 信息返回给调用函数之前将令牌缓存在本地存储中。

除了如何使用 RXJS 正确执行此操作之外,我拥有一切,主要是如何将所有这些链接在一起。我可以使用 Observables 快速获取伪代码来了解如何执行此操作吗?我基本上想在应用程序继续之前拦截JWT并存储在本地存储中(调用函数订阅上面的序列)

任何帮助都会很棒!

【问题讨论】:

    标签: angularjs rxjs


    【解决方案1】:

    我更喜欢这个任务的异步函数。

    var jwtPromise = null;
    
    function getJwt() {
      return jwtPromise || (jwtPromise = getJwtNotCached());
    }
    
    async function getJwtNotCached() {
      const localJwt = getLocalJwt();
      if (localJwt) {
        return localJwt;
      }
      const newJwt = await fetchJwtByPlatform();
      storeLocalJwt(newJwt);
      return newJwt;
    }
    
    async function fetchJwtByPlatform() {
      if (platformIsAndroid()) {
        return await fetchJwtOnAndroid();
      }
      return await fetchJwtOnWindows();
    }
    
    ...
    

    如果一次调用两次,此代码甚至可以确保不会发出多个网络请求。

    【讨论】:

    • 感谢您的回复。这是否适用于 angular 2 HTTP,因为它返回 observables?我可以在 angular 2 HTTP 调用返回的 observable 上使用 await 吗?
    • @RickyFunkhouser 不,你不能,但你可以await observable.toPromise();。这就是为什么我对 angular2 http 返回 observables 感到非常难过。
    • 好的,我想至少尝试一下使用 observables,这样我就可以弄清楚如何正确使用它们。我可以通过承诺来做到这一点,但我觉得我正在围绕 Angular 2 想要我做的事情。我能找到的大多数可观察的例子都对一组数字使用范围函数,这对我没有帮助。我想找到一些示例,其中多个可观察对象可以合并为一个结果(JWT),同时可能在返回调用函数之前处理可观察响应。 RXJS 中的函数和类太多了,我完全迷失了!
    • @RickyFunkhouser 我和你在一起,我也很高兴看到使用 observables 的一个不错的解决方案 :) 也许我会尝试将一些代码与 observables 放在一起,但我希望它会很尴尬,那就是为什么如果其他人在 observables 方面有更多经验这样做会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2022-11-25
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多