Nestjs建议使用HttpModule, 导入来@nestjs/axios执行对外部 API 的请求。我知道将HttpService响应转换为Observables.
从外部 API 请求数据并在应用程序内部使用数据。
我无法理解如何实际从请求中检索数据。我在其他一些答案中读到,如果您从 a 返回可观察值Controller,Nestjs 将自动为您处理它并将数据返回给客户端。这很好,但是,我没有在Controller. 我需要数据在应用程序内可用。
我有一个服务:
@Injectable()
export class ExampleService {
// constructor
getData(): Observable<AxiosResponse<any[]>> {
return this.httpService.get(`http://some-url.com`);
}
}
Run Code Online (Sandbox Code Playgroud)
如何getData()在应用程序逻辑中使用来获取返回的数据Observable?Promises在这种情况下,使用普通的 axios 请求而不使用会更好吗HttpModule?
到目前为止我发现的唯一解决方案是使用subscribe:
this.httpService.get(`http://some-url.com`)
.subscribe((value) => {
console.log(value);
});
Run Code Online (Sandbox Code Playgroud)
与所有花哨的async ... awaits.
到目前为止我发现的唯一解决方案是使用 subscribe
答对了。就是这样完成的:)
与所有花哨的异步...等待相比,这似乎最终会陷入回调地狱
并不真地。作为一个构建为声明性的库,RxJS 可以轻松构建回调。
async/await 只是promises 和的语法糖.then。这是一种语言功能,但即使没有 async/await 承诺也能很好地相互绑定并避免深层嵌套和“回调地狱”
因此,虽然可观察对象不(并且可能永远不会)享受一流的语言结构,例如async/await,但这并不意味着它们不会为您管理一些(或很多)复杂性。
RxJS 库的构建是为了让您通常不必嵌套订阅。
以下被视为反模式:
stream1().subscribe(value1 =>
stream2(value1).subscribe(value2 => {
/* Do something with value2 */
})
)
Run Code Online (Sandbox Code Playgroud)
更惯用的写法是:
stream1().pipe(
mergeMap(value1 => stream2(value1))
).subscribe(value2 => {
/* Do something with value2 */
})
Run Code Online (Sandbox Code Playgroud)
请注意如何删除缩进级别并且您只需要订阅一次?
Observables 带有一组高阶运算符,它们充当.then值流的高度可定制的对象,而不仅仅是单个值。
Observables 是 Promise 的超集,这意味着您可以将任何 Promise 转换为 Observable,但如果您想将 Observable 转换为 Promise,则会丢失结构。通常这不是问题,但让我通过类比来解释。
如果 Promise 是一个值的容器,那么 Observables 就是一个值列表的容器。
我可以获取任何值并从中创建一个列表。我只会得到一个长度为 1 的列表。
a_value = 5
// convert with:
list_values = [a_value]
Run Code Online (Sandbox Code Playgroud)
我无法获取任何列表并从中创造价值。我可以采用第一个值,或最后一个值(如果只有一个,这些可能是相同的),如果列表为空,也许我需要抛出一个错误?也许有一个我会满意的默认值?
也许我有办法将多个值减少为单个值。也许我可以通过将整数列表全部加在一起来将它们转换为一个值。
list_values = [1,2,3,4,5]
// convert with:
value = list_values[0] || 0
// or
value = list_values[list_values.length - 1] || 100
// or
value = sum(list_values)
Run Code Online (Sandbox Code Playgroud)
回到承诺。RxJS 具有firstValueFrom和lastValueFrom作为实用函数,将承诺包装在可观察的周围。
firstValueFrom(
this.httpService.get(`http://some-url.com`)
).then(value => {
/* Do something with value */
});
// or with await as syntactic sugar
value = await lastValueFrom(
this.httpService.get(`http://some-url.com`)
);
/* Do something with value */
Run Code Online (Sandbox Code Playgroud)
这些通常足以满足 http 请求之类的需求(因为它们只返回单个值)。更复杂的方法倾向于在 RxJS 端处理,然后再转换为承诺。
| 归档时间: |
|
| 查看次数: |
7943 次 |
| 最近记录: |