如何从 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: []
        })
      }
    })
  }

无论如何感谢您的帮助。