Проблема с асинхронными вызовами API: повторите первый ответ и передайте значение для выполнения другого вызова API в Angular 6

#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 не подписывается на следующий наблюдаемый объект до завершения предыдущего»

Смотрите это для справки.