#angular #asynchronous #angular6 #switchmap
#angular #асинхронный #angular6 #switchmap
Вопрос:
Я разработчик Java, пытаюсь работать с асинхронными вызовами API, которые необходимо вызывать синхронно. Мне нужно выполнить первый вызов API >> повторить ответ в виде массива >> выполнить другой вызов API >> вернуть ответ последнего вызова API и подписаться на него
Ранее я выполнял несколько вызовов API с помощью switchmap, но понятия не имею, как использовать switchmap или что-либо еще в итерациях.
Вот мой код
multipleAction(actionServiceName,host,hanger,toDoAction) {
.........
let getServiceUrl = `/${proxy}/services/${actionHostName}/`;
if(toDoAction=="stopservice"){
return this.http.get(getServiceUrl,httpOptions)
.pipe(map((output:Response) => {
let array = JSON.parse(JSON.stringify(output));
array.forEach(element => {
if(element.serviceName==actionServiceName amp;amp; element.status=="Up")
{
console.log("stopping service");
// Here is issue. Trying to achieve something like this, being backend developer. i know this API call doesnt work in Angular
let res = this.startStopService(proxy,toDoAction,actionHostName,actionServiceName,element.serviceVersion,httpOptions);
console.log("step 2:",res);
//need this value to be subscribed
return res;
}
});
}));
}
}
И другая функция
startStopService(proxy,toDoAction,actionHostName,actionServiceName,serviceVersion,httpOptions){
let getStatusUrl = `/${proxy}/servicestatus/${actionHostName}/${actionServiceName}/CSS/${serviceVersion}`;
let serviceActionUrl = `/${proxy}/${toDoAction}/${actionHostName}/${actionServiceName}/CSS/${serviceVersion}`;
//these two API calls works fine this function is called separately. but doesnt work synchronously when with previous function
return this.http.get(getStatusUrl,httpOptions)
.pipe(map((output) => {
return output;
}),
switchMap(output =>
this.http.get(serviceActionUrl
JSON.parse(JSON.stringify(output)).statusDescription,
httpOptions)),
tap(output2 => {
console.log(JSON.parse(JSON.stringify(output2)).statusDescription);
}))
}
Ответ №1:
Что вам нужно, так это concatMap.
«concatMap не подписывается на следующий наблюдаемый объект до завершения предыдущего»
Смотрите это для справки.