使用 RXJS 和 Nestjs 发出返回值

Issue returning values with RXJS and Nestjs

我正在从端点获取一些 JSON(为此我使用 @nestjs/axios)。问题是响应是 Observable。这在返回值时使事情复杂化。我似乎无法 async/await 工作,我真的没主意了...

这是我的终点:

async getBalance({ address, network }: WalletDto): Promise<any> {
    let nativeBalance: string

    try {
      this.httpService
        .get<{ balance: string }>(
          `https://deep-index.moralis.io/api/v2/${address}/balance?chain=${network}`,
          {
            headers: {
              Accept: 'application/json',
              'X-Api-Key': 'lol',
            },
          },
        )
        .subscribe({
          next: ({ data }) => {
            nativeBalance = utils.formatEther(data.balance)
          },
          complete: () => {
            const chain = supportedChains.find(
              ({ name }) => name.toLowerCase() === network,
            )

            return {
              chain,
              nativeBalance,
            }
          },
        })
    } catch (error) {
      // TODO handle error
    }
  }

我弄乱了 .pipe() 但不明白它的作用或它是如何工作的...顺便说一句,supportedChains 是一个静态数组,不是获取的一部分。

作为对 Observable 的超级简短介绍:如果 Promise 是一个对象,它只表示一个最终值,那么 Observable 是一个对象,它表示 任意数量 的流最终值。 Observables 带有一组用于操作值流的运算符函数(您提到的管道函数用于传递您想要应用的任何运算符)。

如果您只想将可观察对象转换为承诺,那么您可以使用可观察对象上的 .toPromise 属性 来实现。如果您使用的是 rxjs 版本 7,那么 toPromise 已被弃用,您可以使用 firstValueFromlastValueFrom.

import { firstValueFrom } 'rxjs';
//...
async getBalance({ address, network }: WalletDto): Promise<any> {
  try {
    const observable = this.httpService.get<{ balance: string }>(
      `https://deep-index.moralis.io/api/v2/${address}/balance?chain=${network}`,
      {
        headers: {
          Accept: "application/json",
          "X-Api-Key": "lol",
        },
      }
    );

    const { data } = await observable.toPromise();
    // OR in rxjs v7:
    // const { data } = await firstValueFrom(observable)

    const nativeBalance = utils.formatEther(data.balance);

    const chain = supportedChains.find(
      ({ name }) => name.toLowerCase() === network
    );

    return {
      chain,
      nativeBalance,
    };
  } catch (err) {}
}