您不能直接返回该值,因为它是一个异步调用。异步调用意味着它在后台运行(实际上是安排稍后执行),而您的代码继续执行。
您也不能直接在类中使用此类代码。它需要移动到方法或构造函数中。
你可以做的不是subscribe()
直接而是使用像这样的操作符map()
export class DataComponent{
someMethod() {
return this.http.get(path).map(res => {
return res.json();
});
}
}
此外,您可以将多个.map
与相同的 Observable组合在一起,因为有时这会提高代码的清晰度并保持独立。例子:
validateResponse = (response) => validate(response);
parseJson = (json) => JSON.parse(json);
fetchUnits() {
return this.http.get(requestUrl).map(this.validateResponse).map(this.parseJson);
}
这样一个 observable 将返回调用者可以订阅的
export class DataComponent{
someMethod() {
return this.http.get(path).map(res => {
return res.json();
});
}
otherMethod() {
this.someMethod().subscribe(data => this.data = data);
}
}
调用者也可以在另一个class。这里只是为了简洁。
data => this.data = data
和
res => return res.json()
是箭头函数。它们类似于正常功能。当数据从响应到达时,这些函数被传递到可观察对象subscribe(...)
或map(...)
从可观察对象调用。这就是为什么不能直接返回数据的原因,因为someMethod()
完成时,数据还没有收到。