2016-01-02 5 views
5

Ich bin sehr verwirrt, warum manchmal, wenn ich eine Kombination einer Instanz einer Klasse mit einem Versprechen verwende, ich zwei Arten von Fehlern erhalte. Wenn ich Promise.all() mit zwei oder drei verketteten Versprechen verwende, bekomme ich manchmal nur einen Fehler einer undefinierten Variable innerhalb des Callbacks. Wenn ich eine komplizierte Klasse mit mehreren Eigenschaften und Methoden habe, habe ich eine undefinierte Instanz meiner Klasse mit meiner . Dann() Wenn meine Klasse einfach ist und ich nur ein oder zwei Kettenversprechen verwende, habe ich keine Fehler. Hat jemand eine Idee, warum das so sein könnte? Hier ist ein Beispiel für die Codestruktur Ich bin mit dem Ziel für:ES6 Versprechen und Klassenkonflikt

(Der Code führt ordnungsgemäß in der neuesten Firefox Nightly, aber nicht 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

Warum Sie mischen Einheimische Versprechen mit jQuery defers? – Amit

+1

Kannst du etwas Code posten, der den Fehler demonstriert, anstatt "ein Beispiel für die Code-Struktur, die ich anstrebe" - es ist schwer zu sehen, was du in deinem Code falsch machst, wenn du nicht Code schreibst, der etwas falsch macht –

+0

Ich habe den Code aktualisiert, der einen Fehler anzeigt. Das Seltsame ist, dass ich der Klasse langsam Eigenschaften hinzufügte und dann ein weiteres Versprechen hinzufügte, und ich endete mit dem gleichen Fehler wie zuvor, aber wenn ich nur eine Sache lösche, wie zum Beispiel das Versprechen, bekomme ich immer noch einen Fehler, während ich es vorher getan habe nicht. –

Antwort

0

jquery $.ajax tut Standard-Versprechen nicht zurückgeben, so dass Sie nicht Promise.all mit ihnen verwenden sollten (obwohl Sie können), können Sie stattdessen $.when verwenden, die jquery entspricht. Und statt Erfolg oder Misserfolg auf jeder defered hören/versprechen Sie auf all einmal mit $.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 

}); 

hören können (Der Code in der aktuellen Firefox Nightly korrekt ausgeführt, aber nicht in Chrome 47)

der Grund, es in Chrom Arbeits 47 und arbeitet Firefox Nightly nicht ist, dass ES6 class es in Chrom noch nicht vollständig unterstützt wird (es ist unter Feature Flag derzeit chrome://flags/#enable-javascript-harmony in Chrom 47)

+0

jQuery Versprechen sind Standard genug (* thenable *), dass 'Promise.all' funktioniert. – Bergi

+0

@Bergi Ich denke, ich habe starke Worte dort die Antwort korrigiert – Bek

Verwandte Themen