Concat with if in angular(如何使用带条件的顺序请求)
Concat with if in angular (how to use sequential request with conditions )
我有一个事件调用 3 个 http observable。这些请求的顺序对我很重要。所以我必须使用 rxjs 中的 concat。例如,对于第一个请求,我得到了数据并用它填充了我的局部变量值,然后我想检查其中一个局部变量的结果是否为真,然后发送下一个请求。
类似的东西:
onMyEvent(e) {
let isRoundingAdditionIsRequiered = false;
let ishavePeriodicalDiscount = false;
const api = 'api/Sales/SaleTemplate/' + e;
const firstApiGet = this.dataSourceService.generateCustomApiDataList(
'sales',
'SaleTemplate',
api
).dataList$;
const secondApi= 'api/Sales/Addition/List?$filter=AdditionCode eq "4"'
const secondApiGet= this.dataSourceService.generateCustomApiDataList(
'sales',
'SaleTemplate',
api
).dataList$;
const postApi = 'api/Sales/Contract/CalculateAllRowPrices/';
const calculatePrice = this.dataSourceService.generateCustomApiPost
('sales', 'Contract', postApi, this.entity).dataList$;
}
现在根据 firstApiGet
的结果,我想将 isRoundingAdditionIsRequiered
设置为 true
。像这样:
firstApiGet.subscribe(data => { if (data.RoundingAdditionIsRequiered) {isRoundingAdditionIsRequiered =true} });
然后检查下一个请求:
if (isRoundingAdditionIsRequiered ) {
secondApi.subscribe(data => {// codes here ...})
}
// and other codes ...
这不是按顺序工作的,所以我必须使用 concat 运算符。
类似
concat(firstApiGet,secondApiGet,postApi).subscribe(data=>{//...})
那么密码是多少?
您可以使用 switchMap
运算符。
onMyEvent(e) {
let isRoundingAdditionIsRequiered = false;
let ishavePeriodicalDiscount = false;
const api = 'api/Sales/SaleTemplate/' + e;
const firstApiGet = this.dataSourceService.generateCustomApiDataList(
'sales', 'SaleTemplate', api ).dataList$;
const secondApi= 'api/Sales/Addition/List?$filter=AdditionCode eq "4"'
const secondApiGet= this.dataSourceService.generateCustomApiDataList(
'sales', 'SaleTemplate', api ).dataList$;
const postApi = 'api/Sales/Contract/CalculateAllRowPrices/';
const calculatePrice= this.dataSourceService.generateCustomApiPost(
'sales','Contract',postApi,this.entity).dataList$;
}
firstApiGet.pipe(
switchMap( data => {
isRoundingAdditionIsRequiered = data.RoundingAdditionIsRequiered;
return isRoundingAdditionIsRequiered ? secondApiGet : of( undefined );
),
switchMap( () => calculatePrice )
).subscribe();
}
我有一个事件调用 3 个 http observable。这些请求的顺序对我很重要。所以我必须使用 rxjs 中的 concat。例如,对于第一个请求,我得到了数据并用它填充了我的局部变量值,然后我想检查其中一个局部变量的结果是否为真,然后发送下一个请求。
类似的东西:
onMyEvent(e) {
let isRoundingAdditionIsRequiered = false;
let ishavePeriodicalDiscount = false;
const api = 'api/Sales/SaleTemplate/' + e;
const firstApiGet = this.dataSourceService.generateCustomApiDataList(
'sales',
'SaleTemplate',
api
).dataList$;
const secondApi= 'api/Sales/Addition/List?$filter=AdditionCode eq "4"'
const secondApiGet= this.dataSourceService.generateCustomApiDataList(
'sales',
'SaleTemplate',
api
).dataList$;
const postApi = 'api/Sales/Contract/CalculateAllRowPrices/';
const calculatePrice = this.dataSourceService.generateCustomApiPost
('sales', 'Contract', postApi, this.entity).dataList$;
}
现在根据 firstApiGet
的结果,我想将 isRoundingAdditionIsRequiered
设置为 true
。像这样:
firstApiGet.subscribe(data => { if (data.RoundingAdditionIsRequiered) {isRoundingAdditionIsRequiered =true} });
然后检查下一个请求:
if (isRoundingAdditionIsRequiered ) {
secondApi.subscribe(data => {// codes here ...})
}
// and other codes ...
这不是按顺序工作的,所以我必须使用 concat 运算符。
类似
concat(firstApiGet,secondApiGet,postApi).subscribe(data=>{//...})
那么密码是多少?
您可以使用 switchMap
运算符。
onMyEvent(e) {
let isRoundingAdditionIsRequiered = false;
let ishavePeriodicalDiscount = false;
const api = 'api/Sales/SaleTemplate/' + e;
const firstApiGet = this.dataSourceService.generateCustomApiDataList(
'sales', 'SaleTemplate', api ).dataList$;
const secondApi= 'api/Sales/Addition/List?$filter=AdditionCode eq "4"'
const secondApiGet= this.dataSourceService.generateCustomApiDataList(
'sales', 'SaleTemplate', api ).dataList$;
const postApi = 'api/Sales/Contract/CalculateAllRowPrices/';
const calculatePrice= this.dataSourceService.generateCustomApiPost(
'sales','Contract',postApi,this.entity).dataList$;
}
firstApiGet.pipe(
switchMap( data => {
isRoundingAdditionIsRequiered = data.RoundingAdditionIsRequiered;
return isRoundingAdditionIsRequiered ? secondApiGet : of( undefined );
),
switchMap( () => calculatePrice )
).subscribe();
}