Угловой 2: как вызвать функцию после получения ответа от подписки http.post

Мне нужно вызвать метод после получения данных из почтового запроса http

службы: request.service.TS

get_categories(number){
 this.http.post( url, body, {headers: headers, withCredentials:true})
    .subscribe( 
      response => {
        this.total = response.json();

      }, error => {
    }
  ); 

}

компонент: categories.TS

search_categories() {

this.get_categories(1);
//I need to call a Method here after get the data from response.json() !! e.g.: send_catagories();
}

Работает только если я перехожу к:

службы: request.service.TS

get_categories(number){
 this.http.post( url, body, {headers: headers, withCredentials:true})
    .subscribe( 
      response => {
        this.total = response.json();
        this.send_catagories(); //here works fine

      }, error => {
    }
  ); 

}

Но мне нужно вызвать метод send_catagories() внутри компонента после вызова this.get_categories(1); как это

компонент: categories.TS

search_categories() {

this.get_categories(1);
this.send_catagories(response);
}

Что я делаю неправильно?

Ответ 1

Обновите свой get_categories() чтобы вернуть общее количество (завернутое в наблюдаемое):

// Note that .subscribe() is gone and I've added a return.
get_categories(number) {
  return this.http.post( url, body, {headers: headers, withCredentials:true})
    .map(response => response.json());
}

В search_categories() вы можете подписаться на наблюдаемый, возвращенный get_categories() (или вы можете продолжать преобразовывать его, объединяя больше операторов RxJS):

// send_categories() is now called after get_categories().
search_categories() {
  this.get_categories(1)
    // The .subscribe() method accepts 3 callbacks
    .subscribe(
      // The 1st callback handles the data emitted by the observable.
      // In your case, it the JSON data extracted from the response.
      // That where you'll find your total property.
      (jsonData) => {
        this.send_categories(jsonData.total);
      },
      // The 2nd callback handles errors.
      (err) => console.error(err),
      // The 3rd callback handles the "complete" event.
      () => console.log("observable complete")
    );
}

Обратите внимание, что вы только подписаны ONCE, в конце.

Как я уже сказал в комментариях, метод .subscribe() любого наблюдаемого принимает 3 обратных вызова следующим образом:

obs.subscribe(
  nextCallback,
  errorCallback,
  completeCallback
);

Они должны быть переданы в этом порядке. Вам не нужно проходить все три. Много раз реализуется только nextCallback:

obs.subscribe(nextCallback);

Ответ 2

Вы можете добавить функцию обратного вызова в список параметров get_category (...).

Пример:

 get_categories(number, callback){
 this.http.post( url, body, {headers: headers, withCredentials:true})
    .subscribe( 
      response => {
        this.total = response.json();
        callback(); 

      }, error => {
    }
  ); 

}

И тогда вы можете просто вызвать get_category (...) следующим образом:

this.get_category(1, name_of_function);

Ответ 3

Вы можете кодировать как лямбда-выражение в качестве третьего параметра (по завершении) методу подписки. Здесь я повторно устанавливаю переменную departmentModel в значения по умолчанию.

saveData(data:DepartmentModel){
  return this.ds.sendDepartmentOnSubmit(data).
  subscribe(response=>this.status=response,
   ()=>{},
   ()=>this.departmentModel={DepartmentId:0});
}

Ответ 4

get_categories(number){
 return this.http.post( url, body, {headers: headers, withCredentials:true})
      .map(t=>  {
          this.total = t.json();
          return total;
      }).share();
  );     
}

тогда

this.get_category(1).subscribe(t=> {
      this.callfunc();
});