С трудом обернул голову вокруг наблюдаемых. У меня есть следующее:
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
, чтобы что-то с ним сделать. Должен ли я снова вложить все это?
this.http.get(myOtherUrl)
, да, вложенную внутри, я не уверен, почему вы не хотите этого делать - person Juan Mendes   schedule 05.11.2020this.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