(Angular 2/4/5/6) 具有多个 http 请求的嵌套订阅方法
(Angular 2/4/5/6) Nested subscribe methods with multiple http requests
我需要在订阅方法中调用订阅方法。
在第一个订阅方法中,它 returns 我一个 deviceid 随后在第二个订阅方法中使用。
result=[];
idArray=[2,4];
this.subscription =
this.quoteService.get(this.quoteid) //first api call
.subscribe((quote: Quote) => {
this.deviceid = quote["deviceid"];
this.faultService.get(this.deviceid) //second api call
.pipe(first())
.subscribe((faultGroup: FaultGroup[]) => {
faultGroup.forEach(({ faults }) => {
//execute logic for 2nd subscription
if (faults) {
faults
.filter(
({ id }) => this.idArray.indexOf(id) > -1,
)
.forEach(fault => this.result.push(fault.name));
}
//end of logic
});
});
subscription.unsubscribe();
}
});
有人可以教我如何使用 flatMap/switchMap 来避免使用嵌套订阅吗?感谢您的帮助!
这里你的要求是return然后是第二个API的结果,只是调用第二个API,你需要第一个的结果。为此,switchMap()
最适合您。按照代码中的说明使用它。
this.subOb = this.quoteService.get(this.quoteid) //first api call
.pipe(switchMap((quote: Quote) => {
// result of first API call here
this.deviceid = quote["deviceid"];
// you need to return the second observable from inside the switcMap
// and this will only be executed after the first Observable(first API call) is finished
return this.faultService.get(this.deviceid) //second api call
// need some mode logic after second API call is done? call first()?
// map the result with a pipe
.pipe(map(secondData) => {
// If you aren't manipulating the data
// to be returned, then use tap() instead of map().
return data;
})
}))
.subscribe((data) => {
// only one subscription is required.
// this will have data from second API call
})
使用 ngOnDestroy()
挂钩 unsubcribe()
用于 Subscriptions
。我看到您正在将订阅分配给一个变量,并且可能使用它来取消订阅。如果您的 Observable 发射多次(我认为它不会),那么在第一次发射时 subscribe()
,"subscription" 变量将是未定义的。
ngOnDestroy() {
if (this.subOb) {
this.subOb.unsubscribe();
}
}
在此处查看示例:https://stackblitz.com/edit/swicthmap?file=src%2Fapp%2Fapp.component.ts
它包含两个开关映射的实现,分析两者并使用任何套件。
我需要在订阅方法中调用订阅方法。
在第一个订阅方法中,它 returns 我一个 deviceid 随后在第二个订阅方法中使用。
result=[];
idArray=[2,4];
this.subscription =
this.quoteService.get(this.quoteid) //first api call
.subscribe((quote: Quote) => {
this.deviceid = quote["deviceid"];
this.faultService.get(this.deviceid) //second api call
.pipe(first())
.subscribe((faultGroup: FaultGroup[]) => {
faultGroup.forEach(({ faults }) => {
//execute logic for 2nd subscription
if (faults) {
faults
.filter(
({ id }) => this.idArray.indexOf(id) > -1,
)
.forEach(fault => this.result.push(fault.name));
}
//end of logic
});
});
subscription.unsubscribe();
}
});
有人可以教我如何使用 flatMap/switchMap 来避免使用嵌套订阅吗?感谢您的帮助!
这里你的要求是return然后是第二个API的结果,只是调用第二个API,你需要第一个的结果。为此,switchMap()
最适合您。按照代码中的说明使用它。
this.subOb = this.quoteService.get(this.quoteid) //first api call
.pipe(switchMap((quote: Quote) => {
// result of first API call here
this.deviceid = quote["deviceid"];
// you need to return the second observable from inside the switcMap
// and this will only be executed after the first Observable(first API call) is finished
return this.faultService.get(this.deviceid) //second api call
// need some mode logic after second API call is done? call first()?
// map the result with a pipe
.pipe(map(secondData) => {
// If you aren't manipulating the data
// to be returned, then use tap() instead of map().
return data;
})
}))
.subscribe((data) => {
// only one subscription is required.
// this will have data from second API call
})
使用 ngOnDestroy()
挂钩 unsubcribe()
用于 Subscriptions
。我看到您正在将订阅分配给一个变量,并且可能使用它来取消订阅。如果您的 Observable 发射多次(我认为它不会),那么在第一次发射时 subscribe()
,"subscription" 变量将是未定义的。
ngOnDestroy() {
if (this.subOb) {
this.subOb.unsubscribe();
}
}
在此处查看示例:https://stackblitz.com/edit/swicthmap?file=src%2Fapp%2Fapp.component.ts
它包含两个开关映射的实现,分析两者并使用任何套件。