2016-07-22 39 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函数发送一个post请求到定义的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(“推送数据到服务器”); State.pushData(); } 这里不过是pushData()的调用罢了。 –

+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} 
); 
} 

在上面的函数我刚刚发送POST请求到服务器并返回其控制器功能的响应。从模型返回后立即执行。这是我的控制器功能。

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*/ 
    } 
); 
}