gpt4 book ai didi

rxjs - 从 HttpModule 中可观察的 RxJS 检索数据

转载 作者:行者123 更新时间:2023-12-05 00:57:59 25 4
gpt4 key购买 nike

我无法理解如何在我的 NestJS 应用程序中从 HttpServicemap 数据属性。据我了解,这个 Observable 只是包装了 axios。下面是一些示例代码:

interface Todo {
task: string,
completed: false
}

import {
Injectable,
HttpService,
Logger,
NotFoundException,
} from '@nestjs/common'
import { map } from 'rxjs/operators

async getTodo(todoUrl: string): Todo {
const resp = this.httpService
.get('https://example.com/todo_json')
.pipe(map(response => response.data)) // map task/completed properties?
return resp
}
在这种情况下,

resp 似乎是 Observable 类型。如何在此请求中使用 map 仅检索我想要的数据属性以返回我的 Todo 接口(interface)?

最佳答案

默认情况下,Nest 将为您订阅 observable,它会从您的服务中返回 Observable。在这种情况下,您可以执行类似的操作

@Injectable()
export class TodoService {

constructor(private readonly http: HttpService) {}

getTodos(todoUrl: string): Observable<Todo> {
return this.http.get(todoUrl).pipe(
map(resp => resp.data),
);
}

}

只要你有一个 Controller 类调用 this.todoSerivce.getTodos(todoUrl) 并返回它,就会发出响应。

然而,如果你想把它变成一个 promise ,因为你更习惯它们,你可以将 .toPromise() 方法附加到可观察链上,现在它可以等待(尽管它会更慢,因为它必须等待 observable 发出它的完整事件)。

.toPromise() 示例:

@Injectable()
export class TodoService {

constructor(private readonly http: HttpService) {}

getTodos(todoUrl: string): Todo {
const myTodo = await this.http.get(todoUrl).pipe(
map(resp => resp.data),
).toPromise();
return myTodo;
}

}

编辑 1/20/22

RxJS@^7 中,toPromise() 已弃用,将在 v8 中删除。相反,您可以使用 lastValueFrom 来包装整个 observable

@Injectable()
export class TodoService {

constructor(private readonly http: HttpService) {}

getTodos(todoUrl: string): Todo {
const myTodo = await lastValueFrom(this.http.get(todoUrl).pipe(
map(resp => resp.data),
));
return myTodo;
}

}

关于rxjs - 从 HttpModule 中可观察的 RxJS 检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58983404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com