Тестирование вывода Observable

С трудом обернул голову вокруг наблюдаемых. У меня есть следующее:

const check = this.http.get(myUrl);

Это возвращает данные JSON. Я хочу проверить, существует ли поле URL в данных JSON. Если это не так, я хотел бы запросить второй URL-адрес. (Предположим, что API исправлен и необходимы два вызова, потому что на самом деле это так.)

Проблема в том, что я не могу понять, как это сделать. Если бы check был просто JSON (а не наблюдаемым), это было бы тривиально:

if(check.url) {
    return check;
} else {
    return this.http.get(myOtherUrl);
}

Это явно не работает, так как я не могу напрямую проверить свойство URL. Прочитав страницу об операторах RxJS, я написал следующее:

const check = this.http.get(myUrl);
const mapResponse = map(response => {
    ...format data into JSON structure...
    return jsonResponse;
});
mapResponse(check).subscribe(result => {
  if (result['url']) {
      return result;
  } else {
      return this.http.get(myOtherUrl);
  }
});

Это выглядит безумно неуклюжим, так как для использования второго get мне пришлось бы реплицировать код в лямбда-функции. Не уверен, как получить доступ к результату второго вызова http, чтобы что-то с ним сделать. Должен ли я снова вложить все это?


person eykanal    schedule 04.11.2020    source источник
comment
Когда я публиковал, я заметил это, но не был уверен, что это тот ответ, который я ищу здесь.   -  person eykanal    schedule 05.11.2020
comment
Как вы думаете, что делает возврат значения из обратного вызова подписки?   -  person Juan Mendes    schedule 05.11.2020
comment
Прошу прощения, возврата быть не должно. Отредактировано.   -  person eykanal    schedule 05.11.2020
comment
Вам нужно подписаться на наблюдаемую this.http.get(myOtherUrl), да, вложенную внутри, я не уверен, почему вы не хотите этого делать   -  person Juan Mendes    schedule 05.11.2020
comment
Вам нужно связать свои вызовы в цепочку, я не знаю точного синтаксиса, но что-то вроде this.http.get(myUrl).pipe(flatMap(response) => response.url ? response : this.http.get(myOtherUrl);) Это должно возвращать наблюдаемое для первого или второго запроса в зависимости от того, имел ли первый вызов свойство url. См. stackoverflow.com/questions/ 34104638/   -  person Juan Mendes    schedule 05.11.2020
comment
Также подумайте о преобразовании наблюдаемых объектов в обещания, это сделает его более читабельным, если вы не являетесь экспертом по rx-js.   -  person Juan Mendes    schedule 05.11.2020