Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

187
Visualizações
Angular - encadenando Observables y combinando sus resultados

Quiero ejecutar las siguientes 2 solicitudes en secuencia y combinar sus resultados al final.

  1. Si el cuerpo de la respuesta de la primera solicitud contiene isSuccessful = false , la segunda no debería ejecutarse.
  2. Si la primera solicitud falla por cualquier motivo, la segunda no debería ejecutarse.
  3. Si la segunda solicitud falla, no debería afectar a la primera. combineAndPrintMsg() debería funcionar correctamente solo con el mensaje de respuesta de la primera solicitud.

He intentado anidar suscripciones como se muestra a continuación, pero he oído que no es un buen enfoque.

 firstReq = this.http.get("https://myApi.com/posts?userId=1"); secondReq = this.http.get("https://myApi.com/albums?userId=1"); ..... this.firstReq.subscribe(res1 => { const secondReqResult = this.doSecondRequest(res1); this.combineAndPrintMsg(res1, secondReqResult) }) ..... doSecondRequest(res1: any) { let secondReqResponse; if (res1.isSuccessful) { this.secondReq.subscribe(res2 => { secondReqResponse = res2; }) return secondReqResponse; } } combineAndPrintMsg(res1, res2) { console.log(res1.message + res2.message || ''); }
about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Lo primero que todos deben saber al comenzar con rxjs es no suscribirse a un observable dentro de un observable. (Yo solía hacer esto todo el tiempo también). Hay operadores que fusionan las salidas de observables que deberías aprender.

En este caso, usaré switchMap dentro de la tubería para que el primer observable ejecute el segundo si isSuccessful del primer resultado es verdadero. Luego combino los dos resultados dentro de la canalización de la segunda solicitud, a menos que haya un error. Si es así, se usa catchError para que solo se devuelva el primer resultado.

 firstReq = this.http.get("https://myApi.com/posts?userId=1"); secondReq = this.http.get("https://myApi.com/albums?userId=1"); this.firstReq.pipe( switchMap((res1) => res1.isSuccessful ? this.secondReq.pipe( map((res2) => ({ res1, res2 })), catchError(() => of({ res1, res2: undefined })) ) : of({ res1, res2: undefined }) ), tap(({ res1, res2 }) => this.combineAndPrintMsg(res1, res2)) ); combineAndPrintMsg(res1, res2) { console.log(`${res1.message}${res2?.message}`); }

La elección de switchMap fue arbitraria, debe aprender la diferencia entre eso y concatMap y mergeMap .

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda