2016-02-10 13 views
5

fehlgeschlagen ich mehrere API-Aufrufe mache, nach dem ich die kombinierten Ergebnisse jeder Aufforderung laden möchten:

$.when(
    $.get(localAPI, data, function(response) { 
     globalStore.localShares = Number(response); 
    }), 

    $.get(facebookAPI, '', function(response){ 
     globalStore.facebookShares = Number(response[0].share_count); 
    }), 

    $.getJSON(pinterestAPI, {url: url}).done(function(response){ 
     globalStore.pinterestShares = Number(response.count); 
    }) 
).always(function(){ 
    //Do stuff 
}); 

Wenn die $.get Anrufe fehlschlagen , die Callback-Funktion $.always wird weiterhin ausgeführt.

Aber

Wenn nur ein $.get Aufruf fehlschlägt, negiert er die Aktionen der vorherigen Anrufe. Wenn der erste Anruf fehlschlägt, wird globalStore mit zwei Elementen zurückgegeben. Wenn der erste Aufruf erfolgreich ist, aber der zweite fehlschlägt, wird globalStore mit nur einem Element zurückgegeben. Und wenn die ersten beiden Aufrufe erfolgreich sind, aber der letzte fehlschlägt, wird globalStore leer zurückgegeben.

Gibt es einen Weg um dies zu umgehen?

Edit:

Ja, habe ich versucht, nicht wie diese in $.when handhaben:

$.when(
    $.get(mu30_ajax_frontend.ajaxurl, data, function(response) { 
     globalStore.localShares = Number(response); 
    }).fail(function(){ 
     globalStore.localShares = 0; 
    }), 

    $.get(facebookAPI, '', function(response){ 
     globalStore.facebookShares = Number(response[0].share_count); 
    }).fail(function(){ 
     globalStore.facebookShares = 0; 
    }), 

    $.getJSON(pinterestAPI, {url: url}).done(function(response){ 
     globalStore.pinterestShares = Number(response.count); 
    }).fail(function(){ 
     globalStore.pinterestShares = 0; 
    }) 
).always(function(){ 
    //Do stuff 
}); 

Aber ich das gleiche Ergebnis.

+0

Haben Sie versucht, die Fehler zu behandeln? '$ .get(). fail (function (err) {})' –

+0

Ja, das habe ich gerade versucht. Ich habe den obigen Code hinzugefügt. Immer noch das gleiche Problem. – ibhhvc

+0

Das klingt wie ein Duplikat von [$ .Deferred: Wie man erkennt, wann jedes Versprechen ausgeführt wurde] (http://Stackoverflow.com/q/19177087/1048572), aber ich bin mir nicht sicher, welches genaue Verhalten Sie erwarten von deinem "herum". – Bergi

Antwort

5

Bei der Verwendung von $.when gibt es keine Möglichkeit, auf diese Weise, wenn eine Anfrage fehlschlägt, die gesamte Kette ausfällt.

Sie müssten Ihre eigenen statt rollen, deferreds mit wissen, wann die Anrufe alle abgeschlossen sind, und immer erfolgreich zu lösen usw.

var defs = [new $.Deferred(), new $.Deferred(), new $.Deferred()]; 

$.get(localAPI, data, function(response) { 
    globalStore.localShares = Number(response); 
    defs[0].resolve(true); 
}).fail(defs[0].resolve); 

$.get(facebookAPI, '', function(response){ 
    globalStore.facebookShares = Number(response[0].share_count); 
    defs[1].resolve(true); 
}).fail(defs[1].resolve); 

$.getJSON(pinterestAPI, {url: url}).done(function(response){ 
    globalStore.pinterestShares = Number(response.count); 
    defs[2].resolve(true); 
}).fail(defs[2].resolve); 

$.when.apply($, defs).then(function(result) { 
    // result is an array, any true value is a successful request "[true, true, true]" 
}); 

geschrieben verbosely, dies mit einigen Funktionen verschönert werden könnte und Schleifen usw.

+0

nach meinem vorherigen Kommentar ...Antwort ist weil jquery. –

+1

Sie sollten [das verzögerte Antipattern vermeiden] (http://stackoverflow.com/q/23803743/1048572)! Selbst in jQuery, das nicht "catch" hat, können Sie '.then (null, function (err) {return $ .Deferred(). Resolve (" egal ");})' – Bergi

0

Ich denke, die Lösung, die ich brauchte, war eigentlich eine einfache. Mir war der Erfolg oder Misserfolg egal, ich wollte nur wissen, wann Ajax gemacht wurde. Also:

$.get(mu30_ajax_frontend.ajaxurl, data, function(response) { 
    globalStore.localShares = Number(response); 
}); 

$.get(facebookAPI, '', function(response){ 
    globalStore.facebookShares = Number(response[0].share_count); 
}); 

$.getJSON(pinterestAPI, {url: url}).done(function(response){ 
    globalStore.pinterestShares = Number(response.count); 
}); 

$(document).ajaxStop(function(){ 
    //Do stuff 
}); 
0

Aus dem jQuery $.when() docs (Hervorhebung von mir):

In dem Fall, wo mehrere latenten Objekte jQuery.when übergeben werden(), wobei das Verfahren kehrt das Versprechen von einem neuen " master "Zurückgestelltes Objekt, das den Aggregatstatus aller Deferreds verfolgt, an die es übergeben wurde. Die Methode wird ihren Master Deferred auflösen, sobald alle Deferreds aufgelöst sind, oder den Master Deferred ablehnen, sobald einer der Deferreds abgelehnt wird.

Also, ja jQuery.when wird sofort fehlschlagen, wenn einer der bestandenen Versprechen abgelehnt wird/fehlschlägt.