Ответ 1
Вы просто не можете вернуть значение напрямую, потому что это асинхронный вызов. Асинхронный вызов означает, что он работает в фоновом режиме (фактически запланирован для последующего выполнения), пока ваш код продолжает выполняться.
Вы также не можете иметь такой код в классе напрямую. Его нужно перенести в метод или конструктор.
Что вы можете сделать, это не только subscribe()
, но и использовать оператор типа map()
export class DataComponent{
someMethod() {
return this.http.get(path).map({
res => return res;
});
}
}
Кроме того, вы можете комбинировать несколько .map
с теми же Observables, что иногда это улучшает ясность кода и сохраняет вещи в отдельности. Пример:
validateResponse = (response) => validate(response);
parseJson = (json) => JSON.parse(json);
fetchUnits() {
return this.http.get(requestUrl).map(this.validateResponse).map(this.parseJson);
}
Таким образом, наблюдаемый будет возвратом, вызывающий может подписаться на
export class DataComponent{
someMethod() {
return this.http.get(path).map({
res => return res;
});
}
otherMethod() {
this.someMethod().subscribe(data => this.data = data);
}
}
Вызывающий может также находиться в другом классе. Здесь он просто для краткости.
data => this.data = data
и
res => return res
- функции стрелок. Они похожи на обычные функции. Эти функции передаются на subscribe(...)
или map(...)
для вызова из наблюдаемого, когда данные поступают из ответа.
Вот почему данные не могут быть возвращены напрямую, потому что когда someMethod()
завершено, данные еще не были получены.