2016-07-22 16 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 = [], 
    }); 
} 

ように私はそのgetCartData()関数が実行された後に一度pushQuote要求が完了していること、非同期リクエストを送信したいです。これにあなたの経験を共有してください。前もって感謝します。

+1

あなたの問題は投稿したスニペットには記載されていません。 promiseが解決される前に 'State.getCartData();'がトリガされることはありません。 'State.getCartData();'がどこでトリガーされているかを調べるべきです。これを行う簡単な方法は次のとおりです: 'console.info((new Error())。stack);'実際にスローすることなくエラースタックを記録しますが、アプリケーションの最後の10ステップを表示します'getCartData'を実行しました。お役に立てれば。 – Pjetr

+1

ここにこのモデル関数を呼び出すコントローラ関数があります。 scope.pushIt = function(){ console.log( "サーバーへのデータのプッシュ"); State.pushData(); } ここでは、pushData()の単なる呼び出しです。 –

+0

'getCartData'が実行する最初のものとして' console.info((new Error())。stack);を入れてもいいですか?あなたの投稿にスタ​​ックトレースを編集します。 – 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*/ 
    } 
); 
} 
関連する問題