【问题标题】:Need to use timeout inside Observable subscription to get accurate data需要在 Observable 订阅中使用超时来获取准确的数据
【发布时间】:2019-04-05 03:24:21
【问题描述】:

我在一个名为 settingssettingsLoading 的容器中有两个 Observable。我有一个检索一些设置的 API 调用,一旦调用完成,settingsLoading 将设置为 true,settings 将包含来自 API 的数据。我将settings 数据传递给一个组件,并将settingsLoading 传递给与 Observable 相同的组件。

在该组件中,如下所示,我订阅了settingsLoading Observable,一旦加载为假,我会创建一些控制台日志,以便查看现在应该设置的设置数据。控制台日志总是返回 null ,除非我将它包装在 0 秒的超时中。为什么我需要这样做?这是一种可靠的处理方式吗?有没有更好的方法来避免超时?

在下面的代码中,第一个控制台日志将始终返回 null,而第二个似乎始终包含我期望的数据:

subscribeToLoadSettings() {
    this.settingsLoading.subscribe(loading => {
        if (!loading) {
            // This doesn't work
            console.log('settings', this.settings);
            setTimeout(() => {
                // This works
                console.log('settings', this.settings);
            }, 0);
        }
    });
}

【问题讨论】:

  • 能否包含加载设置的代码以及settingsLoading 的更新方式。那么我们可以帮助您正确构建它。

标签: angular observable ngrx


【解决方案1】:

当一个 observable 依赖于另一个 observable 的结果时,你可以使用 RxJS 操作符,例如 switchMap。

【讨论】:

    【解决方案2】:

    如果您订阅另一个订阅,那将正常工作,不会超时!!!

    但是对于重构代码,你可以使用mergeMap或者switchMap。

    见代码:How to refactor a subscribe inside a subscribe in rxjs

    问候!

    【讨论】:

      猜你喜欢
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多