эй, ребята, я знаю, что этот вопрос опубликовал много, но мне ничего не помогает, поэтому я задаю этот вопрос. Вопрос: я столкнулся с проблемой отправки синхронного запроса на php. вот моя функция Model, которая отправляет запрос.
State.pushData = function () {
$http({
method: 'POST',
url: 'pushData.php?action=pushdata',
data: {'status': 'push', 'email' : State.campemail},
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
}).success(function(response){
if(response.error){
console.log(response.error);
return;
}
State.getCartData();
State.selectedItems = [],
});
}
эта функция pushData отправляет запрос на заданный URL-адрес. и получить ответ. написанный код, предположим, должен выполнить функцию "State.getCartData()" при успехе отправленного запроса. Но это не работает таким образом. оба запроса выполняются сразу. Я пробовал $ http с.post, а затем методами, но с теми же результатами. как это
State.pushData = function () {
$http.post('pushData.php?action=pushdata',
{'status': 'push', 'email' : State.campemail}
).then(function(response){
if(response.error){
console.log(response.error);
return;
}
State.getCartData();
State.selectedItems = [],
});
}
Я хочу отправить запрос асинхронно, после того как запрос pushQuote завершится после выполнения этой функции getCartData(). пожалуйста, поделитесь своим опытом. заранее спасибо.
получил ответ на мой вопрос после некоторого мозгового штурма. Я возвращаю $ http в моей модели и вызываю.then() при возврате ответа. он работал, когда я хочу отправить запрос, как только он будет успешно выполнен. Вот моя модельная функция
State.pushData = function () {
return $http.post('pushData.php?action=pushdata',
{'status': 'push', 'email' : State.campemail}
);
}
в вышеприведенной функции я просто отправляю запрос на сервер и возвращаю его ответ на функцию контроллера. который выполняется сразу после возвращения из модели. вот моя функция контроллера.
scope.pushIt = function() {
var responseObj = State.pushData();
responseObj.then(
function() { //successs call back
/*Business logic*/
State.getCartData();
State.selectedItems = []
},
function() { //Error call back
/*Business logic*/
}
);
}
Красота такого подхода заключается в том, что вы можете использовать такой метод столько, сколько хотите. все они будут выполняться один за другим в цепочке.
scope.pushIt = function() {
var responseObj = State.pushData();
responseObj.then(
function() { //successs call back
/*Business logic*/
},
function() { //Error call back
/*Business logic*/
}
).then(
function() { //successs call back
/*Business logic*/
},
function() { //Error call back
/*Business logic*/
}
);
}
State.getCartData();
может быть вызвано до того, как обещание будет выполнено. Вы должны узнать, гдеState.getCartData();
срабатывает. Простой способ сделать это, это фрагмент:console.info((new Error()).stack);
Это будет регистрировать стек ошибок без фактического выброса, но он покажет вам последние 10 шагов, которые ваше приложение предприняло для выполненияgetCartData
. Надеюсь это поможет.