Как проверить, что оба http-вызова не работают? - PullRequest
0 голосов
/ 28 июня 2018

Я хочу сделать 2 http-звонка и показать ошибку, если оба звонка не будут выполнены, если один из звонков вернет данные, тогда я не хочу показывать ошибку.

this.http.post<any[]>(URL, jsonBody1, postJson) //returns an Observable
this.http.post<any[]>(URL, jsonBody2, postJson) //returns an Observable

Можно ли сделать это, превратив сообщение http в обещания? Я попробовал код ниже, но он не работал. Он пропускает second then () и переходит в catch (), если first then () выдает ошибку, но я хочу, чтобы он делал next then (), если first then () выдает ошибку.

this.http.post<any[]>(URL, jsonBody1, postJson).toPromise()
  .then( data => {
    // do something with data
  })
  .then( _ =>
    this.http.post<any[]>(URL, jsonBody2, postJson).toPromise()
      .subscribe( data => {
          // do something with data
        })
  )
  .catch( error => {
    console.log(error);
  });

Ответы [ 4 ]

0 голосов
/ 28 июня 2018

Простой способ

this.http.post<any[]>(URL, jsonBody1, postJson).subscribe(
  data => {
     this.http.post<any[]>(URL2, jsonBody2, postJson).subscribe(
        data2 => {
           // both calls succeeded
        }
        error => {
           // set error variable to true
        }
     )
  }
  error => {
    // set error variable to true
  }
)
0 голосов
/ 28 июня 2018

Вы можете сделать это только с помощью Observable без изменения на Promise:

forkJoin(
this.http.post<any[]>(URL, jsonBody1, postJson),
this.http.post<any[]>(URL, jsonBody2, postJson)).subscribe (
    x => console.log(x),
    error => console.log(error)
    () => console.log('completed'))

Приведенный выше подход может быть проще, чем использование Promise.

0 голосов
/ 28 июня 2018

С RxJS 6 вы можете сделать это с помощью комбинации операторов forkJoin, catchError и map:

import { forkJoin, of, throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';

const a$ = of(1);
// const a$ = throwError(new Error('Error in $a'));
// const b$ = of('a');
const b$ = throwError(new Error('Error in $b'));

forkJoin(
    a$.pipe(catchError(() => of(null))),
    b$.pipe(catchError(() => of(null))),
  ).pipe(
    map(results => {
      if (results.some(Boolean)) {
        return results;
      }
      throw new Error(`It's broken.`)
    })
  )
  .subscribe(console.log, console.warn);

Посмотреть демо-версию: https://stackblitz.com/edit/rxjs6-demo-hgcsnr?file=index.ts

Только если оба источника false (ошибка перехвата заменена на false), вы получите ошибку.

0 голосов
/ 28 июня 2018

вы можете использовать Promise.all ()

Promise.all(
    this.http.post<any[]>(URL, jsonBody1, postJson).toPromise(),
    this.http.post<any[]>(URL, jsonBody2, postJson).toPromise()
).then(response => {
    let [ response1, response2 ] = response
}).catch(err => {
    console.log({err})
})
...