【问题标题】:Observable data not persisted未持久化的可观察数据
【发布时间】:2017-12-13 21:08:15
【问题描述】:

当我console.log(this.distances) 时,它可用但不存储在内存中。我怎样才能将它存储在内存中以便使用它?即使我在数据到达后运行一个函数,我仍然得到数组的错误是null

这是我的功能:

findClosestRiderToUser() { 
    this.fetchAllRiders().subscribe( async distance => {        
      await this.distances.push( distance );
    });
}

问题:尝试在订阅之外使用this.distances 不起作用。我该如何解决这个问题?

【问题讨论】:

  • 如果函数的一部分是异步的,那么整个事情必须是异步的。稍微格式化您的代码,向我们展示您尝试在哪里执行 console.log
  • async / await 是处理异步数据的一种方法,observables 是另一种方法,不要混用。

标签: javascript rxjs


【解决方案1】:

Observables 通常是异步的,所以

obs$.subscribe(data => this.data = data);
console.log(this.data);

在许多或大多数情况下都不起作用,因为第二行是在数据到达之前运行的。你想要做的是

obs$.subscribe(data => {
    this.data = data;
    console.log(this.data);
});

如果你想在函数中调用这个函数,只需从函数中返回 observable 并从调用者那里订阅:

function getData() { return obs$; }
getData().subscribe(...);

rxjs 带有许多运算符,允许您进一步组合、链接和操作可观察对象。这样您就可以保持完全异步,而不必使用await 来阻止代码的执行。

如果你绝对确实想要阻止,你可以使用

const data = await obs$.toPromise();

但您应该尝试使用响应式模式,而不是一有机会就踩刹车。你也失去了 observable 发出数据流而不仅仅是单个值的能力。

【讨论】:

  • 好的。伟大的!另一个问题是而不是获得一个包含 3 个对象的单个数组。我得到了 3 个数组。源代码在这里:codepen.io/anon/pen/NXPOWe
  • 如果这回答了您的问题,请用绿色复选标记将答案标记为已接受。对于新问题,请打开一个新线程,您可以在其中直接发布相关代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
相关资源
最近更新 更多