2 回答
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。
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的库,则情况可能会有所不同)
添加回答
举报