为了账号安全,请及时绑定邮箱和手机立即绑定

等待订阅完成,然后继续进行代码的下一部分

等待订阅完成,然后继续进行代码的下一部分

千巷猫影 2021-05-10 21:38:16
有一个订阅多数民众赞成在其他一切都设置好之后被调用,但我想等到订阅结束。Ť尝试使用异步等待,但这对我不起作用。不确定我是否做错了public getGlobeConfig() {    this.sourceKey = 'test';query = 'query'    // wait till this call finishes than hit the      console.log('htting')    this.service    .searchQuery(query)    .subscribe(response => {        this.sources = response.hits.hits.map(hit =>         hit._source);        if (this.sources.length > 0) {            this.availableMetadata = Object.keys(                this.sources[0].metadata[this.sourceKey]            );        }    });    console.log('hitting')    return this.sources}由于在下标中设置了this.sources,因此无法达到this.sources的定义
查看完整描述

2 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

简短的答案是您不能在订阅等待后导致代码。话虽如此,通过退后一步并查看您的代码,您不应在该getGlobeConfig方法内进行预订。您可能应该做的是map在getGlobeConfig方法中使用运算符,然后让方法的使用者进行getGlobeConfig订阅:


public getGlobeConfig() {

  // ...

  return this.service.searchQuery(query).pipe(

    map(response => {

      // Transform the response to what you want

      // the consumer of this method to receive

    })

  );

}

消费者:


getGlobeConfig().subscribe(sources => /* ... */)

我从新RxJs开发人员那里看到的一个非常常见的陷阱是,他们尝试在服务中订阅Observable,然后希望将数据返回给组件。在大多数情况下,您不订阅服务。让服务对RxJs运算符中的数据进行操作,并让服务返回转换后的Observable。最终消费者(通常是组件)将订阅服务返回的Observable。


查看完整回答
反对 回复 2021-05-13
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

您的问题是您无法返回异步调用中生成的同步值。您能做的最好的就是返回一个Promise(或其他异步对象)。这就是async await旨在实现的目标:它添加了一些关键字,这些关键字使等待诺言完成的过程变得更加容易,但是最后您仍在使用诺言,而异步函数总是返回诺言。


以下是一些简单的示例:


function doSomethingWithPromise() {

  return somethingThatReturnsAPromise()

    .then((result) => result.calculateSomethingFromResult()) // `then` returns a promise with a result of the callback

}

转换为异步调用:


async function doSomethingWithAsync() {

  // because this is an async function, it returns a promise here, before it finishes waiting

  let result = await somethingThatReturnsAPromise()

  return result.calculateSomethingFromResult() // at this point, after waiting, the function fulfills the promise with this return value

}

这两个例子是等效的。


(这是一个一般示例,例如,如果您使用的是使用流或事件而不是Promise的库,则情况可能会有所不同)


查看完整回答
反对 回复 2021-05-13
  • 2 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信