2016-06-20 11 views
1

I Ajax successives Anfragen bin mit und ich brauche einen Rückruf zu tun, wenn alle successives AnfragenDoppel Ajax-Request Antwort

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 
} 

Mit diesem Code fertig sind, ist die getan Funktionsaufruf, bevor meine Anrufe „exemple2. php "sind erfolgreich.

Wie kann ich darauf warten?

Danke für die Antwort!

Antwort

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

Korrigieren Sie mich, wenn ich falsch liege, aber IE unterstützt es nicht, oder? –

+0

https://api.jquery.com/category/deferred-object/ wird auf IE mit der gleichen Logik unterstützt. Danke! – Bouffe

0

Return ein benutzerdefiniertes latentes Objekt, z:

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

Nun, ich bin nicht sicher, was ist Ihre erwarteten Daten zu $.when().done() Rückruf übergeben.

1

Ihre Unter Ajax-Anforderung ist unabhängig von dem ersten Ajax-Ergebnis, dann wird der Anruf an example2 vollständig getrennt wird versuchen, aus dem $ .when() promise.abort Gerade die Tatsache zu nutzen, dass Jquery $ .ajax Rückkehr versprechen, wie Objekt hier mein Code von 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 
}); 

Achtung, ich ersetzen POST von GET und verwenden exampleX.json Dateien für meine Tests auf plnkr

Sie können es hier testen: https://plnkr.co/edit/5TcPMUhWJqFkxbZNCboz