使用 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
已被弃用,您可以使用 firstValueFrom
或 lastValueFrom
.
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) {}
}
我正在从端点获取一些 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
已被弃用,您可以使用 firstValueFrom
或 lastValueFrom
.
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) {}
}