Angular не возвращает ожидаемое значение

Я немного новичок в Angular (7). Я пытаюсь получить код состояния, когда выполняю HTTP-запрос. Вот код, который я использую в службе:

checkIfSymbolExists() {
     return this.http.get(this.url, { observe: 'response' })
      .subscribe(response => {
        return response.status;
      });
  }

И я использую возвращаемое значение в методе одного из моих компонентов, например:

onSubmit() {
    console.info(this.stocks.checkIfSymbolExists());
}

Я ожидал, что вернется число, но вместо этого у меня есть объект:

Subscriber {closed: false, _parent: null, _parents: null, _subscriptions: Array(1), syncErrorValue: null, …}
closed: true
destination: SafeSubscriber {closed: true, _parent: null, _parents: null, _subscriptions: null, syncErrorValue: null, …}
isStopped: true
syncErrorThrowable: true
syncErrorThrown: false
syncErrorValue: null
_parent: null
_parentSubscription: null
_parents: null
_subscriptions: null
__proto__: Subscription

Когда вместо того, чтобы просто возвращать response.status, я делаю по нему console.info, я получаю код состояния 200, как и ожидалось (число, а не объект).

Есть идеи, почему это не то же поведение при возврате значения response.status, как показано здесь? Спасибо.

Какой у вас код backend API?

random 10.11.2018 18:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
633
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы делаете это неправильно. Вот правильный способ сделать это:

Сначала вы возвращаете сопоставленный ответ от http.get вместо subscribe оттуда. Поэтому вам нужно использовать .pipe(map(...)) вместо subscribe:

import { map } from 'rxjs/operators';
...
checkIfSymbolExists() {
  return this.http.get(this.url, { observe: 'response' })
    .pipe(
      map(res => (res.status === 200))
    );
}

Затем вы возвращаете наблюдаемое из checkIfSymbolExists, а затем subscribe в него методом onSubmit:

onSubmit() {
  this.stocks.checkIfSymbolExists()
    .subscribe(res => console.info(res));
  // This should print true if status is 200. false instead.
}

Объяснение:

Обязанность вашего метода обслуживания checkIfSymbolExists() - дать Компоненту то, что он хочет. Таким образом, вашему Компоненту не нужно знать, откуда именно ваша служба получает эти данные. Ему просто нужно получить boolean при подписке на Observable, возвращенный checkIfSymbolExists().

Теперь метод checkIfSymbolExists() получает ответ, и вы также добавили в observe опцию полного ответа. map - это просто оператор Rxjs, который преобразует ответ. Внутри map мы проверяем наличие res.status, которое мы получим, потому что у нас есть observed ответ, выполнив { observe: 'response' }.

Теперь map вернет все, что было возвращено оператором сравнения ===, который вернет true, если status - это 200, и false в противном случае.

Надеюсь, это поможет вам лучше понять.

Спасибо за ответ. Что, если я хочу проверить код состояния внутри метода службы? Примерно так: response => {if (response.status === 200) {return true; } else {вернуть ложь; }} (править: извините за отступ)

tomfl 10.11.2018 18:51

Вы очень fast XD. И это сработало! Большое спасибо ! Я не совсем уверен, что делают все эти методы, но вижу, что мне еще многому нужно научиться ^^

tomfl 10.11.2018 18:57

@tomfl, пояснение добавил. Надеюсь, это поможет вам немного понять, что происходит.

SiddAjmera 10.11.2018 19:03

Большое тебе спасибо. Скажите, если я ошибаюсь, но причина, по которой мы выполняем subscribe с ответом (?) В компоненте (а не в службе), заключается в том, что ответ является асинхронным, а это означает, что выполняется остальная часть кода, и только затем ответ отправляется (после того, как он был загружен с сервера), верно?

tomfl 10.11.2018 19:10

да. Вы можете так сказать. Все, что вы напишете в блоке subscribe, будет вызвано только после того, как будет получен ответ, а затем map передан службой.

SiddAjmera 10.11.2018 19:12

Другие вопросы по теме