2016-07-22 3 views
0

эй, ребята, я знаю, что этот вопрос опубликовал много, но мне ничего не помогает, поэтому я задаю этот вопрос. Вопрос: я столкнулся с проблемой отправки синхронный запрос на php. вот моя функция модели, которая отправляет запрос.

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() будет выполняться. пожалуйста, поделитесь своим опытом. заранее спасибо.

+1

Насколько я могу судить, ваша проблема не в том фрагменте, который вы опубликовали. Невозможно запустить 'State.getCartData();', до того, как будет разрешено обещание. Вы должны выяснить, где запускается 'State.getCartData();'. Простой способ сделать это, это фрагмент: 'console.info ((new Error()). Stack);' Это будет записывать стек ошибок, не бросая его, но он покажет вам последние 10 шагов вашей заявки взял для выполнения 'getCartData'. Надеюсь это поможет. – Pjetr

+1

вот функция контроллера, вызывающая эту функцию модели. scope.pushIt = function() { console.log ("pushing Data to server"); State.pushData(); } вот только вызов callData(). –

+0

Не могли бы вы поставить 'console.info ((new Error()). Stack);' как первое, что выполняет 'getCartData'? И отредактируйте трассировку стека в свой пост. – Pjetr

ответ

0

получил ответ на мой вопрос после некоторого мозгового штурма. Я возвращаю $ 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*/ 
    } 
); 
}