在我的应用中,我使用了POST
来调用所有service
请求。
从服务器获取特定代码(E.x:401)时,我调用API来获取新令牌。
直到收到另一个令牌,如果还有其他API调用,我会将所有这些请求存储在一个数组中。可能是 n 个请求。现在,假设正在进行3个API调用,而对newToken API的调用正在进行中。
一旦获得新令牌,我必须在所有后续API中传递该令牌。现在,我必须执行所有待处理的API请求,并将数据提供给它们各自的调用。
代码示例:
api.service.ts
POST(URL , param){
return new Observable<any>(observer => {
let headers = new HttpHeaders({
'Content-Type': 'Content-Type': 'application/json'
});
let options = {
headers: headers
};
this.http.post(URL, param, options)
.subscribe(data => {
var apiRes: any = data;
this.inValidSession();
observer.next();
observer.complete();
}
......
// For execute pending request I have set this
for (let i = 0; i < this.queue.length; i++) {
this.REPOST(this.queue[i].param, this.queue[i].url).subscribe((queueResponse) => {
observer.next(queueResponse);
observer.complete();
this.queue.shift();
});
}
}
user.component.ts
ngOnInit(){
this.getUserData();
this.getProductData();
}
getUserData(){
this.apiService.post({},'/apiName').subscribe((response) => {
console.log(response);
})
}
getProductData(){
this.apiService.post({},'/apiName2').subscribe((response) => {
console.log(response);
})
}
问题是,当我执行所有待处理的API时,我在控制台中获取了数据。但不是subscribe
从服务文件到相应的.ts
文件的功能。
注意:我仅在一个函数中获得订阅数据,而不是每个函数。换句话说,我在getProductData()
函数中获得了两个API资源。我不知道为什么。
如果有任何解决方案,请帮助我。
答案 0 :(得分:2)
您可以使用
forkJoin()
要同时处理多个呼叫,您可以在其中呼叫多个request
,订阅后将获得array
的响应。
例如
forkJoin(Service1.call1,
Service2.call2)
.subscribe(([call1Response, call2Response]) => {
其中service1和service2是具有功能ccall1和call2且具有return
类型Observable
的service
您可以找到更多Here
答案 1 :(得分:1)
使用ForkJoin
我们将使用一个名为forkJoin的运算符。如果你熟悉 对于Promises,这与Promise.all()非常相似。
forkJoin()运算符使我们可以获取Observables和
的列表。
并行执行它们。
列表中的每个Observable都发出一个值后,forkJoin将
发出一个包含所有已解析列表的单个Observable值
列表中“观察值”中的值。
在此示例中,我想加载一个角色和一个角色家庭世界。我们已经知道这些资源的ID是什么,因此我们可以并行请求它们。
import { Component } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, forkJoin } from 'rxjs';
@Component({
selector: 'app-root',
templateUrl: 'app/app.component.html'
})
export class AppComponent {
loadedCharacter: {};
constructor(private http: HttpClient) { }
ngOnInit() {
let character = this.http.get('https://swapi.co/api/people/1');
let characterHomeworld = this.http.get('http://swapi.co/api/planets/1');
forkJoin([character, characterHomeworld]).subscribe(results => {
// results[0] is our character
// results[1] is our character homeworld
results[0].homeworld = results[1];
this.loadedCharacter = results[0];
});
}
}
在上面的示例中,我们捕获了变量中的character和characterHomeworld Observable。观测值是懒惰的,因此只有有人订阅时它们才会执行。当我们将它们传递给forkJoin时,forkJoin运算符将订阅并运行每个Observable,收集每个发出的值,最后发出包含所有已完成HTTP请求的单个数组值。这是JavaScript UI编程的典型模式。与使用传统回调相比,使用RxJS相对容易。
使用 mergeMap / flatMap 和 forkJoin 运算符,我们仅需几行代码即可完成非常复杂的异步代码。
答案 2 :(得分:1)
简便方法
使用forkjoin()
void redirect(char *msg){
int fd = fopen("hello.txt", 'wb');
pid_t child = fork();
if(child == 0){
dup2(fd, STDOUT_FILENO);
execve("/bin/echo", msg, environ);
}
}
答案 3 :(得分:0)
使用zip
中的rxjs
lib
import { zip } from "rxjs";
myFun() {
zip(service.api1, service.api2)
.subscribe(([response1, response2]) => {
console.log(response1);
console.log(response2);
})
}