如何从 Observable 中提取数据
How to extract data from an Observable
我试图了解如何从 Observable 类型的对象中提取数据,经过一些研究后,我主要采用了两种解决方案。订阅(在我的情况下不起作用或我使用不当),或不再存在的地图。我指定我使用嵌套。
这里我的目标是能够直接return变量this.followers填充答案
的数据
这是我的代码。
import { HttpService } from '@nestjs/axios';
import { Injectable } from '@nestjs/common';
import { GithubFollower } from './../../../../shared/github.models'
@Injectable()
export class GithubService {
private followers: GithubFollower[]
constructor(private httpService: HttpService) {}
getFollowers(id: string): GithubFollower[] {
this.httpService.get<GithubFollower[]>(`https://api.github.com/users/${id}/followers`)
.subscribe(data => {
this.followers = data.data // this.followers = my data
console.log(this.followers); // print my data
});
console.log("here", this.followers); // print "here undefined"
return this.followers; // this.followers = []
}
}
如何从 Observable 中提取数据?
尽管 .toPromise
在 RxJs 8 中已弃用,但您可以在 rxjs 7 及以下版本中使用它。所以试试这个:
async getFollowers(id: string): GithubFollower[] {
const githubData = await this.httpService.get<GithubFollower[]>(`https://api.github.com/users/${id}/followers`).toPromise()
this.followers = githubData.data
return this.followers; // this.followers now returns the followers instead of undefined
}
根据我昨天晚上的问题,我找到了两个解决方案。
第一个是使用 pipe
函数(即使我不太了解它的作用,我也很乐意在这个 post 的评论中得到解释)它给了我们这个:
getFollowers(id: string): Observable<DashBoardResponse> {
return this.httpService
.get<GithubFollower[]>(`https://api.github.com/users/${id}/followers`)
.pipe(
map(res => {
const response: DashBoardResponse = {
code: res.data !== [] ? 200 : 400,
message: res.data !== [] ? 'success' : 'Possible bad id',
response: res.data
}
return response;
})
)
}
然后 nest 能够在将响应发送回客户端之前从控制器中提取响应。
我可以拥有的第二个解决方案是对@KZoeps 稍作修改,因为在当前版本的 nest 上,如果没有 returning 就无法使用 async/await
函数一个Promise
。
这是代码:
这里我的目标是能够直接return变量this.followers填充答案
的数据
async getFollowers(id: string): Promise<DashBoardResponse> {
this.followers = await (await this.httpService.get<GithubFollower[]>(`https://api.github.com/users/${id}/followers`).toPromise()).data
return new Promise((resolve, reject: (reason?: DashBoardResponse) => void) => {
if (this.followers !== []) {
resolve({
code: 200,
message: 'success',
response: this.followers
});
} else {
reject({
code: 400,
message: 'Possible bad id',
response: []
})
}
})
}
无论如何感谢您的帮助。
我试图了解如何从 Observable 类型的对象中提取数据,经过一些研究后,我主要采用了两种解决方案。订阅(在我的情况下不起作用或我使用不当),或不再存在的地图。我指定我使用嵌套。
这里我的目标是能够直接return变量this.followers填充答案
的数据这是我的代码。
import { HttpService } from '@nestjs/axios';
import { Injectable } from '@nestjs/common';
import { GithubFollower } from './../../../../shared/github.models'
@Injectable()
export class GithubService {
private followers: GithubFollower[]
constructor(private httpService: HttpService) {}
getFollowers(id: string): GithubFollower[] {
this.httpService.get<GithubFollower[]>(`https://api.github.com/users/${id}/followers`)
.subscribe(data => {
this.followers = data.data // this.followers = my data
console.log(this.followers); // print my data
});
console.log("here", this.followers); // print "here undefined"
return this.followers; // this.followers = []
}
}
如何从 Observable 中提取数据?
尽管 .toPromise
在 RxJs 8 中已弃用,但您可以在 rxjs 7 及以下版本中使用它。所以试试这个:
async getFollowers(id: string): GithubFollower[] {
const githubData = await this.httpService.get<GithubFollower[]>(`https://api.github.com/users/${id}/followers`).toPromise()
this.followers = githubData.data
return this.followers; // this.followers now returns the followers instead of undefined
}
根据我昨天晚上的问题,我找到了两个解决方案。
第一个是使用 pipe
函数(即使我不太了解它的作用,我也很乐意在这个 post 的评论中得到解释)它给了我们这个:
getFollowers(id: string): Observable<DashBoardResponse> {
return this.httpService
.get<GithubFollower[]>(`https://api.github.com/users/${id}/followers`)
.pipe(
map(res => {
const response: DashBoardResponse = {
code: res.data !== [] ? 200 : 400,
message: res.data !== [] ? 'success' : 'Possible bad id',
response: res.data
}
return response;
})
)
}
然后 nest 能够在将响应发送回客户端之前从控制器中提取响应。
我可以拥有的第二个解决方案是对@KZoeps 稍作修改,因为在当前版本的 nest 上,如果没有 returning 就无法使用 async/await
函数一个Promise
。
这是代码:
这里我的目标是能够直接return变量this.followers填充答案
async getFollowers(id: string): Promise<DashBoardResponse> {
this.followers = await (await this.httpService.get<GithubFollower[]>(`https://api.github.com/users/${id}/followers`).toPromise()).data
return new Promise((resolve, reject: (reason?: DashBoardResponse) => void) => {
if (this.followers !== []) {
resolve({
code: 200,
message: 'success',
response: this.followers
});
} else {
reject({
code: 400,
message: 'Possible bad id',
response: []
})
}
})
}
无论如何感谢您的帮助。