Нарушение l oop после проверки результата из наблюдаемого в angular - PullRequest
0 голосов
/ 18 июня 2020

Я хотел бы разбить l oop после проверки условия из возврата наблюдаемого. Когда статус - False, я хочу выйти из l oop. У меня есть следующий код:

var response = Observable<responseService>;
var i;
for (i =0; i < lin.length; i++){
 response = this.http.post<responseService>(this.Url, {}, options).pipe(
    map(data => {
      return data;
    }),
    catchError((err) => {
      return of(null);
      }
    ));

  var res = response.map(x => x.status);
  console.log(res);
  if (res === "False" || res === null) {
    response{
     status: "FALSE",
     message: "ERROR"
    }
   return of(response);
  }
}
return response;

Но я получаю сообщение об ошибке для условия if, как показано ниже

"Условие всегда будет возвращать false, поскольку типы 'Observable <>' и «строка» не пересекается ».

Я был бы очень признателен, если бы кто-нибудь знал, что я делаю неправильно или у меня есть решение. Спасибо!

1 Ответ

0 голосов
/ 18 июня 2020
  1. Вы не подписываетесь на наблюдаемый объект и не пытаетесь сравнить наблюдаемый объект со строкой. При сравнении if (res === "False" || res === null) переменная res по-прежнему является наблюдаемой.

  2. Наличие вложенных подписок не является хорошей практикой. И здесь вам не поможет, если вы будете sh выполнять каждый запрос последовательно, пока один запрос не выдаст False или если null.

Вы можете попробовать создать массив запросов и подписаться на него последовательно с помощью функции Rx JS from и оператора concatMap. Затем прервите последовательность с помощью оператора takeUntil, если условие выполнено. Попробуйте следующее

import { Subject, from, of } from 'rxjs';
import { takeUntil, concatMap } from 'rxjs/operators';

private getData() {
  let closeRequest$ = new Subject<any>();
  let response = Observable<responseService>;
  let requests = Observable<responseService>[];
  for (let i =0; i < lin.length; i++) {
    requests.push(this.http.post<responseService>(this.Url, {}, options))   // <-- don't map response here
  }

  from(requests).pipe(
    concatMap(request => of(request)),
    takeUntil(closeRequest$)
  ).subscribe(
    response => {
      if (!response['status'] && response['status'] === "False") {    // <-- check for `response.status` truthiness
        // response is false
        this.someVar = { status: "FALSE", message: "ERROR" };
        this.closeRequest$.next();
        this.closeRequest$.complete();
      } else {
        this.someVar = status;
      }
    },
    error => { }
  );
}
...