Что делает функция .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 она работает с Observables.

Это означает, что он подпишется на интересующий 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 один раз.