Угловой 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();
});