Что делает функция .subscribe()?
Я кодирую API с Angular2
и NodeJS
, я реализую службы для своего API, который должен получить список задач и отобразить его. Вот сервис задач:
import {Injectable} from '@angular/core';
import {Http, Headers} from '@angular/http';
import 'rxjs/add/operator/map';
@Injectable()
export class TaskService{
constructor(private http:Http){
console.log('Task Service Initialized...');
}
getTasks(){
return this.http.get('http://localhost:3000/api/tasks')
.map(res => res.json());
}
}
Для моей функции getTask
(исправьте меня, если я ошибаюсь) функция .map()
принимает мой ответ и форматирует его в массиве значений.
Вот теперь компоненты задачи, которые используют службу задач:
import { Component } from '@angular/core';
import {TaskService} from '../../services/task.service';
@Component({
moduleId: module.id,
selector: 'tasks',
templateUrl: 'tasks.component.html',
})
export class TasksComponent {
constructor(private taskService:TaskService){
this.taskService.getTasks()
.subscribe(tasks =>{
console.log(tasks);
})
}
}
Я хотел бы понять, что делает эта функция .subscribe()
, и я не могу найти соответствующую информацию.
Ответы
Ответ 1
Функция .subscribe()
похожа на методы Promise.then()
, .catch()
и .finally()
в jQuery
, но вместо работы с promise
она работает с Observable
s.
Это означает, что он подпишется на интересующий observable
(в вашем случае getTasks()
) и будет ждать, пока он не станет successful
, а затем выполнит первую переданную функцию обратного вызова, которая в вашем случае:
tasks => {
console.log(tasks);
}
Если вы хотите, чтобы он запускал некоторую логику при ошибке (аналогично .catch()
) или при завершении (аналогично .finally()
), вы можете передать эту логику в subscribe
следующим образом:
observable.subscribe(
value => somethingToDoOnlyOnSuccess(value),
error => somethingToDoOnlyOnError(error),
() => somethingToDoAlways()
);
Больше примеров и подробностей можно найти здесь here
Ответ 2
Главное преимущество subscribe
по сравнению с обещанием then
- вы можете неоднократно уведомлять изменения с помощью observer.next(data)
, и ваши подписчики будут реагировать на каждое изменение.
new Observable(observer => observer.next(data));
Итак, если у вас несколько слушателей одного и того же события - все они получат событие изменения каждый раз, когда наблюдатель генерирует новые данные и вызывается observer.next()
. Это очень полезно, когда у вас есть данные, которые можно часто менять, и вы хотите, чтобы один и предсказуемый поток уведомляли ваших слушателей.
Promise then
позволяет вам ждать операцию async один раз.