2016-06-20 27 views
1

私はアヤックスsuccessives要求を使用していると私はすべてのsuccessives要求は、このコードでダブルAJAX要求応答

function doAjaxRequest(data, id) { 
    // Get payment Token 
    return $.ajax({ 
     type: "POST", 
     url: 'exemple1.php', 
     data: data 
     success: function(msg){ 
      $.ajax({ 
       type: "POST", 
       url: 'exemple2.php', 
       data: msg, 
       success: function(msgr) { 
        document.getElementById(id).value=msgr; 
       }, 
       error:function (xhr, status, error) { 
        //Do something 
       } 
      }); 
     }, 
     error:function (xhr, status, error) { 
      //Do something 
     } 
    }); 
} 

$.when(
    doAjaxRequest(data, "input-1"), 
    doAjaxRequest(otherData, "input-2") 
).done(function(a1, a2){ 
    //Need do something when both second ajax requests (example2.php) are finished 
} 

を行っているコールバックを行う必要が行わ機能はexemple2」への私の呼び出し前に呼び出しです。 php "が成功します。

どうすればそれを待つことができますか?

ありがとうございます!

答えて

1
function doAjaxRequest(data, id) { 
    // Get payment Token 
    return new Promise(function(resolve,reject){ 
     $.ajax({ 
     type: "POST", 
     url: 'exemple1.php', 
     data: data 
     success: function(msg){ 
      $.ajax({ 
       type: "POST", 
       url: 'exemple2.php', 
       data: msg, 
       success: function(msgr) { 
        document.getElementById(id).value=msgr; 
        resolve(); 
       }, 
       error:function (xhr, status, error) { 
        //Do something 
        reject(); 
       } 
      }); 
     }, 
     error:function (xhr, status, error) { 
      //Do something 
      reject(); 
     } 
    }); 
    }); 
} 



Promise.all([ 
    doAjaxRequest(data, "input-1"), 
    doAjaxRequest(otherData, "input-2")]) 
.then(function(values){ 
    //Need do something when both second ajax requests (example2.php) are finished 
} 
+0

私が間違っていてもIEがそれをサポートしていないのであれば修正してください。 –

+0

https://api.jquery.com/category/deferred-object/は、同じロジックでIEでサポートされています。 ありがとう! – Bouffe

0

戻るカスタム繰延オブジェクト、例えば:今すぐ

function doAjaxRequest(data, id) { 
    var d = new $.Deferred(); 
    // Get payment Token 
    $.ajax({ 
     type: "POST", 
     url: 'exemple1.php', 
     data: data 
     success: function(msg){ 
      $.ajax({ 
       type: "POST", 
       url: 'exemple2.php', 
       data: msg, 
       success: function(msgr) { 
        document.getElementById(id).value=msgr; 
        d.resolveWith(null, [msgr]); // or maybe d.resolveWith(null, [msg]); 
       }, 
       error:function (xhr, status, error) { 
        //Do something 
        d.reject(); 
       } 
      }); 
     }, 
     error:function (xhr, status, error) { 
      //Do something 
      d.reject(); 
     } 
    }); 
    return d; 
} 

、私はあなたの予想件のデータが$.when().done()コールバックに渡されるかわからないんだけど。

1

あなたのサブAJAXリクエストが最初のAjaxの結果の独立している、その後、例2の呼び出しは完全に$ .when()promise.abort から分離されているだけでjqueryの$アヤックス復帰という事実を使用するようにしてくださいplnkr

// Code goes here 
function doAjaxRequest(data, id) { 
    // Get payment Token 
    return $.ajax({ 
     type: "GET", 
     url: 'example1.json', 
     data: data 
    }).then(function(msg, status, jqXhr) { 
     return $.ajax({ 
      type: "GET", 
      url: 'example2.json', 
      data: msg 
     }); 
    }).done(function(msgr) { 
     console.log(msgr); 
     return msgr; 
    }); 
} 

var data = {foo:'bar'}; 
var otherData = {foo2:'bar2'}; 

$.when(
    doAjaxRequest(data, "input-1"), 
    doAjaxRequest(otherData, "input-2") 
).done(function(a1, a2) { 
    console.log(a1, a2); 
    //Need do something when both second ajax requests (example2.php) are finished 
}); 

アテンションから自分のコードここでは、オブジェクト のように約束し、私はGETでPOSTを交換し、あなたがここでそれをテストすることができplnkr

に私のテストのためにexampleX.jsonファイルを使用します。https://plnkr.co/edit/5TcPMUhWJqFkxbZNCboz