在 Angular 中解析多个 api 调用
Resolve in Angular for multiple api calls
我试图在使用 Resolve 加载组件之前调用 3 个不同的 API。
下面的代码写在 resolve 函数中,返回一个包含所有响应的对象。
现在当组件加载时,在我收到服务器的响应之前..它returns返回对象中每个键的空值。
请帮我解决这个问题。在未收到 API.
的响应之前,如何阻止它返回
resolve() {
this._apiFactory.getA().subscribe(response => {
responseA = response;
});
this._apiFactory.getB().subscribe( response => {
responseB = response;
});
this._apiFactory.getC().subscribe( response => {
responseC = response;
});
return {
'A': responseA ,
'B': responseb ,
'C': responseC
};
}
您在订阅完成之前返回了。使用 Fork Join 等待所有 Get
请求完成,然后以所需格式返回获取请求的结果..
更新
Since Rxjs 6.5.0, forkJoin also accepts an object as an argument.
// dummy Observables
const obsArg = {
A: of([1]).pipe(delay(1000)),
B: of([1, 2, 3]).pipe(delay(2000)),
C: of([1, 2, 3, 4]).pipe(delay(3000))
}
return forkJoin(obsArg)
我在 Angular 6
中尝试过,我能够做到:
// dummy Observables
let a = of([1]).pipe(delay(1000));
let b = of([1, 2, 3]).pipe(delay(2000));
let c = of([1, 2, 3, 4]).pipe(delay(3000));
let join = forkJoin(a,b,c).pipe(map((allResponses) => {
return {
A: allResponses[0],
B: allResponses[1],
C: allResponses[2]
};
}));
return join;
因此,我操作了 forkJoin
中的数据并返回了 forkJoin
本身。在这里查看:https://stackblitz.com/edit/angular-xepafp?file=src%2Fapp%2FAPIResolver.ts
在 angular2 中,像这样的东西应该可以工作:
resolve() {
return Observable.forkJoin(
this._apiFactory.getA(),
this._apiFactory.getB(),
this._apiFactory.getC()
).map((allResponses) => {
return {
A: allResponses[0],
B: allResponses[1],
C: allResponses[2]
};
})
}
这也可以用 combineLatest
来完成。参见 this stackblitz
import { Injectable } from "@angular/core";
import { Resolve, ActivatedRouteSnapshot } from "@angular/router";
import { of, combineLatest } from "rxjs";
import { delay } from "rxjs/operators";
@Injectable({
providedIn: "root"
})
export class TestResolver implements Resolve<any> {
constructor() {}
resolve(route: ActivatedRouteSnapshot) {
let a = of([1]).pipe(delay(1000));
let b = of([1, 2, 3]).pipe(delay(2000));
let c = of([1, 2, 3, 4]).pipe(delay(3000));
return combineLatest(a, b, c);
}
}
从 RxJS 6.5+ 开始,方法是:
return forkJoin({
todos: timer(500).pipe(mapTo([{ title: 'forkJoin'}])),
user: timer(500).pipe(mapTo({ id: 1 }))
});
请不要使用 Subscribe,您可以 return 您的 observables 作为
let a= observable(1);
let b= observable(2);
let c= observable(3);
return forkJoin(a,b,c);
这对你有帮助
我试图在使用 Resolve 加载组件之前调用 3 个不同的 API。
下面的代码写在 resolve 函数中,返回一个包含所有响应的对象。
现在当组件加载时,在我收到服务器的响应之前..它returns返回对象中每个键的空值。
请帮我解决这个问题。在未收到 API.
的响应之前,如何阻止它返回resolve() {
this._apiFactory.getA().subscribe(response => {
responseA = response;
});
this._apiFactory.getB().subscribe( response => {
responseB = response;
});
this._apiFactory.getC().subscribe( response => {
responseC = response;
});
return {
'A': responseA ,
'B': responseb ,
'C': responseC
};
}
您在订阅完成之前返回了。使用 Fork Join 等待所有 Get
请求完成,然后以所需格式返回获取请求的结果..
更新
Since Rxjs 6.5.0, forkJoin also accepts an object as an argument.
// dummy Observables
const obsArg = {
A: of([1]).pipe(delay(1000)),
B: of([1, 2, 3]).pipe(delay(2000)),
C: of([1, 2, 3, 4]).pipe(delay(3000))
}
return forkJoin(obsArg)
我在 Angular 6
中尝试过,我能够做到:
// dummy Observables
let a = of([1]).pipe(delay(1000));
let b = of([1, 2, 3]).pipe(delay(2000));
let c = of([1, 2, 3, 4]).pipe(delay(3000));
let join = forkJoin(a,b,c).pipe(map((allResponses) => {
return {
A: allResponses[0],
B: allResponses[1],
C: allResponses[2]
};
}));
return join;
因此,我操作了 forkJoin
中的数据并返回了 forkJoin
本身。在这里查看:https://stackblitz.com/edit/angular-xepafp?file=src%2Fapp%2FAPIResolver.ts
在 angular2 中,像这样的东西应该可以工作:
resolve() {
return Observable.forkJoin(
this._apiFactory.getA(),
this._apiFactory.getB(),
this._apiFactory.getC()
).map((allResponses) => {
return {
A: allResponses[0],
B: allResponses[1],
C: allResponses[2]
};
})
}
这也可以用 combineLatest
来完成。参见 this stackblitz
import { Injectable } from "@angular/core";
import { Resolve, ActivatedRouteSnapshot } from "@angular/router";
import { of, combineLatest } from "rxjs";
import { delay } from "rxjs/operators";
@Injectable({
providedIn: "root"
})
export class TestResolver implements Resolve<any> {
constructor() {}
resolve(route: ActivatedRouteSnapshot) {
let a = of([1]).pipe(delay(1000));
let b = of([1, 2, 3]).pipe(delay(2000));
let c = of([1, 2, 3, 4]).pipe(delay(3000));
return combineLatest(a, b, c);
}
}
从 RxJS 6.5+ 开始,方法是:
return forkJoin({
todos: timer(500).pipe(mapTo([{ title: 'forkJoin'}])),
user: timer(500).pipe(mapTo({ id: 1 }))
});
请不要使用 Subscribe,您可以 return 您的 observables 作为
let a= observable(1);
let b= observable(2);
let c= observable(3);
return forkJoin(a,b,c);
这对你有帮助