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

有一个订阅多数民众赞成在其他一切都设置好之后被调用,但我想等到订阅结束。Ť


尝试使用异步等待,但这对我不起作用。不确定我是否做错了


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的定义


千巷猫影
浏览 207回答 2
2回答

holdtom

简短的答案是您不能在订阅等待后导致代码。话虽如此,通过退后一步并查看您的代码,您不应在该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。

开心每一天1111

您的问题是您无法返回异步调用中生成的同步值。您能做的最好的就是返回一个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的库,则情况可能会有所不同)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript