forkJoin tidak meneruskan status 401 sebagai kesalahan di aplikasi MEAN

Di aplikasi MEAN saya, saya menggunakan forkJoin di Angular 6 untuk melakukan panggilan berurutan ke server saya.

Setiap kali ada kesalahan saat meminta data, saya meneruskan status 401 bersama dengan objek kesalahan.

Saya berlangganan permintaan tersebut, tetapi fungsi error tidak terpicu. Hanya fungsi data yang dipicu dengan objek kesalahan.

Ini kode saya:

Kode berkas TS

forkJoin(
      this.http.post(url1, obj1).pipe(map((res:Response) => res)),
      this.http.post(url2, obj2).pipe(map((res:Response) => res))
  ).subscribe(
    data => {

      console.log('Data Called');

    },
    error => {

      console.log('Error Called');


    });

Kode NodeJS:

res.status(401).send({ error: "error", message: "Oops! Please try again" });
res.end();

person Anirudh    schedule 01.02.2019    source sumber


Jawaban (1)


Pertama-tama Anda ingin memanggil sesuatu secara berurutan, Anda tidak boleh menggunakan forkJoin ini akan mengaktifkan semua permintaan sekaligus dan kemudian menunggu semuanya selesai. Jika Anda ingin memanggilnya satu per satu gunakan concat

import { concat } from 'rxjs/operators';
import { of } from 'rxjs';    

//emits 1,2,3
const sourceOne = of(1, 2, 3);
//emits 4,5,6
const sourceTwo = of(4, 5, 6);

//used as static
const example = concat(sourceOne, sourceTwo);

Tapi selain itu. Pertanyaan Anda adalah mengapa metode kesalahan tidak terpicu. Dan itu karena rantai pengamat hancur saat kesalahan terjadi di tengah pemrosesan. Jika Anda ingin melindungi diri Anda dari hal ini, Anda harus menyimpannya dalam cache di tempat yang bermasalah.

forkJoin(
      this.http.post(url1, obj1).pipe(map((res:Response) => res)).pipe(catchError(val => of('I caught: ${val}'))),
      this.http.post(url2, obj2).pipe(map((res:Response) => res)).pipe(catchError(val => of('I caught: ${val}')))
  ).subscribe(
    data => {
      console.log('Data Called');
    },
    error => {
      console.log('Error Called');
    });

Atau opsi kedua adalah menyimpannya dalam cache. Tapi kemudian Anda tidak mendapatkan apa-apa jika salah satu observasi menghasilkan kesalahan.

forkJoin(
          this.http.post(url1, obj1).pipe(map((res:Response) => res)),
          this.http.post(url2, obj2).pipe(map((res:Response) => res))
      )
.pipe(catchError(val => of('I caught: ${val}')))
.subscribe(
        data => {
          console.log('Data Called');
        },
        error => {
          console.log('Error Called');
        });

Dokumentasi dengan jelas menyatakan hal tersebut: https://www.learnrxjs.io/operators/combination/forkjoin.html

person piotr szybicki    schedule 01.02.2019