2016-07-22 61 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*/ 
    } 
); 
}