РЕДАКТИРОВАТЬ:
Отказ от ответственности: Я не знаю много конкретно о Nest, поэтому этот ответ с чисто ванильной точки зрения JS, разные библиотеки имеют разные встроенные способности. Далее следует объяснение различных способов обработки асинхронных запросов и наблюдаемых в javascript. Я также настоятельно рекомендую читать асинхронные javascript, наблюдаемые и обещания, поскольку это сделает ваше время в javascript гораздо более приятным.
Веб-запросы в javascript происходят асинхронно, что означает, что они выполняются чаще или менее параллельно с остальной частью вашего синхронного кода. Вы можете представить это как отдельную ветку, хотя это не так. Это означает, что код, основанный на значении этого веб-запроса, должен останавливаться до тех пор, пока запрос не будет завершен. Из моего исходного поста ниже, самый простой вариант в вашем случае, вероятно, вариант 3. Код для его использования может выглядеть примерно так:
/**
* A method in your rest controller that relies on the getSomething()
* method as implemented in option 2 below
*/
async showRemoteData() {
const remoteData = await appService.getSomething();
// replace console.log with whatever method you use to return data to the client
console.log(remoteData);
}
Оригинальный ответ
Вы не можете получить значение из наблюдаемой синхронно. Вы должны подписаться на него и сделать что-то после того, как значение будет возвращено, или преобразовать его в обещание и вернуть обещание. Возможны следующие варианты:
// option 1 change getSomething to doSomething, and do everything in that method
doSomething(): Array<Object> {
let resp = this.httpService.get(this.DATA_URL);
resp.subscribe((value) => { // do something })
}
// option 2 return the observable and subscribe to it outside of that method
getSomething(): Array<Object> {
return this.httpService.get(this.DATA_URL);
}
// outside of the AppService you can use it like this
appService.getSomething().subscribe((value) => {// do something})
// option 3 convert the observable to a promise and return it
getSomething(): Array<Object> {
return this.httpService.get(this.DATA_URL).toPromise();
}
// outside of the AppService you can use it like this
let value = await appService.getSomething();
console.log(value);
Из параметров опция 3 позволяет вам использовать asyn c и ожидать, что не является синхронным, но позволяет обрабатывать остальную часть кода в методе asyn c как будто это так, так что это может быть ближе всего к тому, что вы хотите. Я лично считаю, что вариант 2 - ваш лучший вариант, поскольку вы сохраняете всю функциональность наблюдаемых объектов, включая весь набор доступных вам операторов. Примите асинхронный код в javascript, это лучшее и зачастую единственное решение многих проблем.