【问题标题】:Return promise value from observable subsciption从可观察订阅返回承诺值
【发布时间】:2019-11-12 01:33:43
【问题描述】:

有没有机会从 getDataFromApi() 的 helpMe 函数值返回?到目前为止,每次我调用这个函数时,我都会得到“null”值。

       async function helpMe() {
            let promise = null;
            let sub = someService.someObservable.subscribe(async () => {
               promise = await getDataFromApi()
            })
            subscriptions.push(sub)
            return promise;
        }

第一个目标是我需要将订阅存储在全局子数组中。第二个目标是当我得到状态为 400 的响应时 - 我不想打开模式。只有当我得到 200 并且一切正常时,我才希望打开模式。

function async load() {
  const promise = await helpMe();
  openModal();
}

【问题讨论】:

  • 我在这里可能是盲人,但你为什么需要在这里观察?你就不能做let promise = await getDataFromApi()
  • 此外,据我所知,await 不能处理 subscribe 结果,因为它返回一个不能“等待”的 Observable。如果你想 await 它,你应该将 observable 转换为 Promise (因此承诺为空)
  • subscribe 多久触发一次回调?如果多次使用,那么无论如何使用 Promise 是没有意义的。
  • 什么是subscriptions
  • 我需要将此订阅存储在全局订阅数组中,以便在其他服务中进行进一步操作。

标签: javascript angular async-await observable subscription


【解决方案1】:

async 函数传递给subscribe 是没有意义的——它会丢弃返回的promise,它不会等待任何东西。你需要使用

new Promise((resolve, reject) => {
    someService.someObservable.subscribe(resolve, reject);
})

或者直接调用内置的toPromise method:

async function helpMe() {
    await someService.someObservable.toPromise();
    return getDataFromApi();
}

【讨论】:

    【解决方案2】:

    您可以使用普通的rxjs,而不是使用 async/await 功能。 switchmap 运营商可能会在这里为您提供帮助:

    public helpMe()
    {
      return this.someService.someObservable.pipe(
        switchMap(result =>
        {
          return someDataFromApi();
        }),
        tap(resultFromApi => {
          // ... do something with `resultFromApi` from `someDataFromApi`.
        }),
      ).toPromise();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 2019-07-23
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多