【问题标题】:observable first() and subscribe可观察的 first() 并订阅
【发布时间】:2019-06-19 16:35:38
【问题描述】:

有没有办法等待订阅调用返回的第一个值?

例如,在下面:

async getValue(...) {
  myObs$ = ...
  let val = await myObs$.pipe(first()).toPromise()
  myObs$.subscribe(val => {
    this.value = val
  })
  return val
}

异步函数将返回一个 val 的 Promise,但我还想订阅并获取一个数据成员值,该值将在可观察的 myObs$ 发出新值时更新。

我的问题:是否可以在不使用 first() 调用的情况下返回 Promise 并等待我第一次在 subscribe 中得到结果?

【问题讨论】:

  • 订阅后可以切换顺序使用await myObs$.pipe(first()).toPromise()
  • 调用 toPromise 会隐式订阅调用它的 observable。
  • 我应该说上面的代码有效,但我遇到的问题与我获得两次值有关,一次用于 first() 行,然后在订阅中。我正在尝试确定是否可以等待订阅然后返回它,但也继续更新任何未来更新的值。
  • 为什么要等待 observable 发出一个值?当您第一次收到 subscribe 中的值时,您可以调用一个函数。这将是一种被动的方式。
  • 我需要同步的值,也想缓存值(并保持更新),这样我就不必再去服务器了。唯一真正的问题是我必须在上面的代码中两次访问服务器,并希望避免额外的调用。

标签: rxjs


【解决方案1】:

这里没有真正的理由需要这个方法是异步的,因为调用者必须等待它或使用 .then() 无论如何。您可以简单地将其重写为:

getValue(...) {
  myObs$ = ...
  myObs$.subscribe(val => {
    this.value = val
  })
  return myObs$.pipe(first()).toPromise()
}

这将保留您的内部订阅并允许它继续接收值,而 getValue 的调用者将收到第一个发出值的 Promise。

【讨论】:

  • 谢谢你的建议,不过我写的代码会等待值并同步返回,也会订阅以后的更新,但第一次更新会来两次,我希望只能以某种方式获得第一个。
猜你喜欢
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2018-11-26
  • 2017-06-21
相关资源
最近更新 更多