2016-01-02 2 views
5

Sono molto confuso sul motivo per cui a volte quando uso una combinazione di un'istanza di una classe con una promessa ottengo due tipi di errori. Se utilizzo Promise.all() con due o tre promesse concatenate, a volte ricevo solo un errore di una variabile non definita all'interno del callback. Quando ho una classe complicata con proprietà e metodi multipli, ho un'istanza indefinita della mia classe con il mio .then() Se la mia classe è semplice e io uso solo una o due promesse concatenate, non ho errori. Qualcuno ha qualche idea del perché questo potrebbe essere? Ecco un esempio della struttura del codice sto puntando:Conflitto di classe e promessa ES6

(il codice viene eseguito correttamente l'ultimo Firefox Nightly, ma non in Chrome 47)

'use strict'; 
 

 
class Controller { 
 
\t constructor() { 
 
\t \t this.data = 'data'; 
 
\t \t this.moredata = 'data'; 
 
\t \t this.evenmore = ['a', 'b', 'c']; 
 
\t \t this.dataobj = {"a" : "1", "b" : "2", "c" : "3"}; 
 
\t } 
 
} 
 

 
//BLOCKED CODE 
 
{ 
 
\t let cc = new Controller(); 
 
\t let loadeddata = null; 
 
\t 
 
\t let xhr = $.getJSON('chapters.json', {}, (response) => { 
 
\t \t loadeddata = response; //SOMETIMES IF CLASS IS COMPLEX IS NOT DEFINED (SOMETIMES IT IS) 
 
\t }).fail(() => { 
 
\t \t console.log('Failed to load JSON data!'); 
 
\t }); 
 
\t 
 
\t let xhr2 = $.getJSON('chapters.json', {}, (response) => { 
 
\t \t loadeddata = response; 
 
\t }).fail(() => { 
 
\t \t console.log('Failed to load JSON data!'); 
 
\t }); 
 
\t 
 
\t let xhr3 = $.getJSON('chapters.json', {}, (response) => { 
 
\t \t loadeddata = response; 
 
\t }).fail(() => { 
 
\t \t console.log('Failed to load JSON data!'); 
 
\t }); 
 
\t 
 
\t let xhr4 = $.getJSON('chapters.json', {}, (response) => { 
 
\t \t loadeddata = response; 
 
\t }).fail(() => { 
 
\t \t console.log('Failed to load JSON data!'); 
 
\t }); 
 
\t 
 
\t 
 
\t //SOMETIMES WITH COMPLICATED CLASS WITH ONE OR TWO PROMISES DOES NOT THROW ERROR 
 
\t Promise.all([xhr, xhr2, xhr3, xhr4]).then(() => { 
 
\t \t console.log(loadeddata); 
 
\t \t console.log(cc); //SOMETIMES CC IS NOT DEFINED (SOMETIMES IT IS) 
 
\t }); 
 
}

+2

Perché sei mescolando promesse native con i defender jQuery? – Amit

+1

Puoi pubblicare un codice che mostri l'errore, piuttosto che "un esempio della struttura del codice che sto puntando" - è difficile vedere cosa stai facendo nel codice errato se non inserisci il codice che sta facendo qualcosa di sbagliato –

+0

Ho aggiornato il codice che mostra un errore. La cosa strana è che lentamente ho aggiunto delle proprietà alla classe e poi ho aggiunto un'altra promessa, e ho finito con lo stesso errore di prima, ma se elimino solo una cosa come la promessa, ottengo ancora un errore mentre prima facevo non. –

risposta

0

jquery $.ajax fa non restituire la promessa standard quindi non si dovrebbe usare Promise.all con loro (anche se è possibile), è possibile utilizzare $.when invece che è equivalente jquery. E invece di ascoltare fallimento o il successo su ogni defered/promessa si può ascoltare su tutti i una volta con $.when

var xhr1 = $.getJSON('chapters.json'); 
var xhr2 = $.getJSON('chapters.json'); 
var xhr3 = $.getJSON('chapters.json'); 

$.when(xhr1, xhr2, xhr1) 
.done(function(response1, response2, response3){ 

}) 
.fail(function(data, textStatus, jqXHR){ // first failed xhr 

}); 

(Il codice viene eseguito correttamente l'ultimo Firefox Nightly, ma non in Chrome 47)

la ragione non sta funzionando in cromo 47 e lavorare Firefox Nightly è che ES6 class es non è pienamente supportato in cromo ancora (è sotto la bandiera caratteristica attualmente chrome://flags/#enable-javascript-harmony in cromo 47)

+0

jQuery promises sono abbastanza standard (* thenable *) che 'Promise.all' funziona su di loro. – Bergi

+0

@Bergi Penso di aver usato parole forti lì corretto la risposta – Bek