我通常是一名PHP开发人员,几乎没有使用javascript / typescript的经验。刚开始使用NestJS-我想拥有一个端点,该端点返回通过其端点从另一个系统检索的requisitions
列表。
大概的想法:
requisition
列表端点我已经尝试过像这样调用端点:
const url ='https://the-requisition-endpoint';
const config: AxiosRequestConfig = {
headers: {
'Accept': 'application/json',
'Authorization': 'a_hard_coded_token_string' // hard coded for experimentation
}
};
let result = this.httpService.get(url, config);
result.subscribe(response =>
console.log(response.data);
});
现在,我需要对其进行更改,以便不对令牌进行硬编码-要使用来自登录端点的令牌。
我不确定如何仅在登录端点返回令牌后才强制调用请求端点。我搜索后发现,是Promise.all()
或a function called zip
might help,
但是我不知道如何使它起作用。
答案 0 :(得分:1)
我相信您要查找的RxJS运算符是switchMap。本质上,您将需要做这样的事情:
@Injcetable()
export class MyService {
constructor(private readonly httpService: HttpService) {}
getRequisitions(): Observable<any> {
// change to POST signature is login is a post. post(url, body, config)
return this.httpService.get(url, config).pipe(
// optional, but it makes working with responses easier
map(resp => resp.data),
// make new http call and switch to this observable
switchMap(loginData => this.httpService.get(url, configWithLoginData)),
/ again, optional, but useful for keeping data easily readable
map(resp => resp.data),
// optional, but useful for checking what is returned
tap(data => console.log(data))
}
}
好的,这里发生了很多事情,所以我们也将其分解。在NestJS中,内置的HttpService返回Observables而不是Promises。这使您可以执行一些非常强大的工作,例如在发生某些故障时重试HTTP调用。可以用promises来完成,但是确实需要更多代码。无论如何,在第一个HTTP调用之后的.pipe
允许我们开始处理RxJS流并处理通过的数据。
map
是一个RxJS运算符,与Array.prototype.map
运算符类似,因为它对每个可观察到的值应用了转换函数(在这种情况下,它只是一个值,但它可以工作对于许多理论上的人。)
switchMap
与mergeMap
和concatMap
一起是RxJS中的扁平化运算符之一。我将让您从与上述相同的链接中进行阅读,但实际上,switchMap
取消了当前可观察到的内容,而推荐使用新创建的链接,这有助于我们避免内存泄漏。我们返回一个新的Observable(一个新的HttpService调用),并开始使用该数据。
tap
是一个间谍运算符,因为它对它可以访问的数据不做任何事情,它只允许您查看(通过console.log)。这几乎是它的用途,但是如果需要并且响应无关紧要,您可以进行其他标注。
最后,没有subscribe
,因为NestJS将在后台进行订阅并发送最后发出的值作为响应。不必自己担心。
哦,对所有map(resp => resp.data)
的响应是AxiosResponse有多个字段,但是在大多数情况下,您可能只关心data
属性中保存的返回数据。
每个RxJS运算符都接受一个函数,在每种情况下,我们都是使用一个行函数。如果需要,您可以使用完整的匿名函数语法。即
map((resp) => {
return resp.data;
})
单行语法只是较短的语法,尽管如果必须执行不适合一行的其他逻辑,则将需要重写。