Понимание того, как бороться с наблюдаемыми возвратами от http-вызовов

Я только начал с приложения Angular 2, которое делает некоторые http-вызовы, и это познакомило меня с Observables. Мне все еще трудно научиться с ними справляться, документации немного не хватает для начинающих. Я приведу короткий пример, чтобы проиллюстрировать трудности, с которыми я сталкиваюсь:

getValue() {        
        let headers = new Headers({ 'Content-Type': 'text/plain' });
        let options = new RequestOptions({ headers: headers });
        return this.http.get('http://url/boolean.json', options)
}

Это вызов get, который возвращает логическое значение. Теперь, если я захочу использовать это значение в функции, я инстинктивно ожидаю, что смогу присвоить переменную следующим образом:

let varName = this.getValue()

Очевидно, это невозможно, я читал, что для получения вывода из наблюдаемого вам нужно подписаться на него. Нет ли возможности позволить моей функции getValue() возвращать логическое значение, а не наблюдаемое? Однако в этом случае, поскольку мне нужно только логическое значение, я не уверен, имеет ли смысл асинхронное программирование? Не то чтобы это могло занять много времени. Есть ли в Angular 2 способ избавиться от этого асинхронного поведения (для таких простых функций?)?


person hY8vVpf3tyR57Xib    schedule 10.05.2016    source источник


Ответы (1)


Вы можете «симулировать» псевдосинхронный режим, используя канал async Angular2:

<div>{{value | async}}</div>

В этом случае value является наблюдаемым, а не содержимым ответа HTTP.

Таким образом, Angular2 автоматически подписывается за вас и управляет соответствующей подпиской. Когда данные получены, шаблон соответствующим образом обновляется.

На самом деле вы не можете обойти асинхронный режим, поскольку именно так работает базовый API (XMLHttpRequest) для выполнения HTTP-запросов (и, в более общем случае, JavaScript).

Вы можете заметить, что Rx / Observables действительно эффективны для обработки цепочки. Например, вы можете использовать такие операторы, как flatMap, и вы можете подписаться только в конце цепочки. Вот пример:

this.getValue().flatMap((data) => {
  // return another observable
  return this.getAnotherRequest();
}).subscribe((data) => {
  // data is the result of the second request
});

Этот учебник Rx может помочь вам:

Изменить

Вот как можно использовать операторов:

this.getCurrentUser().flatMap((user) => {
  // return another observable
  return this.getData(user);
}).subscribe((data) => {
  // data is the result of the second request
}, (err) => {
  // no current user, ...
});
person Thierry Templier    schedule 10.05.2016
comment
Это только для в шаблоне. Но что, если мне нужно это значение в моем бэкенде? Например, чтобы проверить, аутентифицирован ли какой-либо человек? - person hY8vVpf3tyR57Xib; 10.05.2016
comment
На самом деле вы можете связать наблюдаемые и использовать для этого операторов. Я обновил свой ответ образцом. - person Thierry Templier; 10.05.2016