2016-11-01 2 views
2

У меня есть следующий код, который возвращает наблюдаемый, он проверяет, является ли this.data действительным JSON, в противном случае он пытается извлечь его из url. Извлечение и все работает.rxjs Наблюдаемый .map не выполняется

load():Observable<IStandardListOutput[]> { 

return Observable.create(observer => { 

    if (this.needsFetch) { 
    var data; 
    this.http.get(this.data) 
     .map(res => { 
     var result = res.text(); 
     // console.log(result); 
     try { 
      data = JSON.parse(result) 
     } catch (e) { 
      return Observable.of([{error:"ERROR LOADING JSON: " + this.data}]); 
     } 
     return data; 
     }).subscribe(res => { 
     observer.next(this._parse(res)); 
     observer.complete(); 
     }); 
    }else { 
    observer.next(this._parse(this.data)); 
    observer.complete(); 
    } 
}); 

}

Сейчас на карте/подписываться часть наблюдателя я следующее:

let observable$ = this.loader.load(); // <-- load method above 
observable$.map(res => { 
    console.warn ("IN MAP: " + JSON.stringify(res)); 
}); 

observable$.subscribe(res=> { 
    console.log("IN SUB: " + JSON.stringify(res)); 
    }, 
    err => { 
    console.log(JSON.stringify(err)) 
    }, 
() => { 
    console.info("COMPLETE") 
    } 
); 

То, что я вижу в выводе/консоли только "IN SUB" (подписаться) и «ПОЛНАЯ». Функция console.warn в .map никогда не выполняется.

Любая помощь высоко ценится, заранее спасибо

+0

Chech здесь http://stackoverflow.com/questions/34671715/angular2-http-get-map-subscribe-and-observable-pattern-basic-understan –

ответ

4

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

observable$.map(res => { 
    console.warn ("IN MAP: " + JSON.stringify(res)); 
}).subscribe(); 

И еще один совет по отладке rxjs, если вы хотите заглянуть в значение, вы всегда можете использовать do оператора (вместо вашего map).

observable$ 
    .do((v) => console.log('debug point: ', v)) // <-- this is the addition. 
    .subscribe(...your original handlers go here ...) 
+0

Как обыкн ваш ответ отличается от моего, ваша карта ничего не возвращает –

+0

Он приклеился к исходному коду, просто активировал его. Тем не менее, поскольку наблюдаемое становится горячим, оно будет проходить через карту и печатать. Если это было .subscribe (v => console.log (v)), оно будет представлять пустое значение. Ваш пример назначил наблюдаемый $ = наблюдаемый $ .map (...), он изменяет наблюдаемый, и следующая подписка будет терпеть неудачу. – Meir

+1

хорошо, спасибо, теперь он работает. Я думал, что подписаться на наблюдаемый $ было достаточно ... (/ me Observable n00b) :( – pythic

Смежные вопросы