2016-02-10 19 views
5

sto effettuare le chiamate API multiple, dopo di che voglio caricare i risultati combinati di ogni chiamata:

$.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 
}); 

Se le chiamate non riescono $.get , la funzione di callback $.always viene ancora eseguita.

Ma

Se solo $.get chiamata non riesce, nega le azioni dei precedenti bandi.

Quindi, se la prima chiamata fallisce, globalStore restituisce con due voci. Se la prima chiamata ha esito positivo ma il secondo non riesce, globalStore restituisce con un solo elemento. E se le prime due chiamate hanno esito positivo ma l'ultimo non riesce, globalStore restituisce vuoto.

C'è qualche modo per aggirare questo?

Edit:

Sì, ho cercato di gestire guasti entro $.when come questo:

$.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 
}); 

Ma ottengo lo stesso risultato.

+0

Hai provato a gestire i guasti? '$ .get(). fail (function (err) {})' –

+0

Sì, l'ho appena provato. Ho aggiunto il codice sopra. Ancora ottenere lo stesso esatto problema. – ibhhvc

+0

Sembra un duplicato di [$ .Deferred: Come rilevare quando è stata eseguita ogni promessa] (http://stackoverflow.com/q/19177087/1048572), ma non sono sicuro di quale comportamento esatto ci si aspetta dal tuo "modo di aggirare". – Bergi

risposta

5

Non c'è modo di aggirare questo quando si utilizza $.when in questo modo, se una richiesta non riesce, l'intera catena non riesce.

Avresti per rotolare il proprio, invece, utilizzando deferreds di sapere quando le chiamate sono tutte completate, e sempre risolvere con successo ecc

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]" 
}); 

scritto verbosely, questo potrebbe essere prettied con alcune funzioni e cicli ecc.

+0

per il mio commento precedente ...la risposta è perché jquery. –

+1

Si dovrebbe [evitare l'antipattern differito] (http://stackoverflow.com/q/23803743/1048572)! Anche in jQuery, che non ha 'catch', puoi fare' .then (null, function (err) {return $ .Deferred(). Resolve ("non importa");}) ' – Bergi

0

Penso che la soluzione di cui avevo bisogno fosse in realtà una soluzione semplice. Non mi importava del successo o del fallimento, volevo solo sapere quando è stato fatto ajax. Quindi:

$.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

Dalle jQuery $.when() docs (sottolineatura mia):

Nel caso in cui più oggetti differite sono passati a jQuery.when(), il metodo restituisce la promessa di un nuovo " master "Oggetto differito che tiene traccia dello stato aggregato di tutti i differiti che è stato passato. Il metodo risolverà il suo comando Rimandato non appena tutti i differiti verranno risolti, oppure rifiutare il master rimandato non appena uno dei differiti viene respinto.

Quindi, sì jQuery.when fallirà immediatamente se una delle promesse passate viene rifiutata/non riesce.

Problemi correlati