2016-01-02 10 views
5

मैं बहुत उलझन में हूं कि कभी-कभी जब मैं एक वर्ग के उदाहरण के संयोजन का उपयोग करता हूं तो मुझे दो प्रकार की त्रुटियां मिलती हैं। यदि मैं दो या तीन जंजीर वादे के साथ Promise.all() का उपयोग करता हूं तो मुझे कभी-कभी कॉलबैक के भीतर एक अपरिभाषित चर की त्रुटि मिलती है। जब मेरे पास कई गुणों और विधियों के साथ एक जटिल वर्ग है, तो मेरे पास के साथ मेरी कक्षा का एक अनिर्धारित उदाहरण है .then() यदि मेरी कक्षा सरल है और मैं केवल एक या दो शापित वादे का उपयोग करता हूं तो मुझे कोई त्रुटि नहीं है। क्या किसी को कोई विचार है कि यह क्यों हो सकता है? यहाँ कोड संरचना मैं के लिए लक्ष्य कर रहा हूँ का एक उदाहरण है:ES6 वादा और कक्षा संघर्ष

(कोड को ठीक से नवीनतम फ़ायरफ़ॉक्स रात में कार्यान्वित करता है, लेकिन क्रोम 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

क्यों आप मिश्रण कर रहे हैं jQuery defers के साथ देशी वादे? – Amit

+1

क्या आप कुछ कोड पोस्ट कर सकते हैं जो 'कोड संरचना का उदाहरण है' के बजाय त्रुटि का प्रदर्शन करता है - यह देखना मुश्किल है कि आप अपने कोड में क्या गलत कर रहे हैं यदि आप कुछ गलत कर रहे कोड को पोस्ट नहीं करते हैं –

+0

मैंने कोड अपडेट किया है जो एक त्रुटि दिखाता है। अजीब चीज यह है कि मैंने धीरे-धीरे कक्षा में गुण जोड़े और फिर एक और वादा जोड़ा, और मैं पहले की तरह ही एक ही त्रुटि के साथ समाप्त हुआ, लेकिन अगर मैं सिर्फ एक चीज जैसे वादे को हटा देता हूं, तो मुझे अभी भी एक त्रुटि मिलती है जबकि मैंने किया नहीं। –

उत्तर

0

jQuery $.ajax करता है मानक वादा वापस नहीं करें, इसलिए आपको उनके साथ Promise.all का उपयोग नहीं करना चाहिए (हालांकि आप कर सकते हैं), आप $.when का उपयोग कर सकते हैं, जो कि jquery समतुल्य है। और विफलता या प्रत्येक defered पर सफलता सुनने की बजाय/वादा तुम्हारे साथ $.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 

}); 

सभी को एक बार पर सुन सकते हैं (कोड को ठीक से नवीनतम फ़ायरफ़ॉक्स रात में कार्यान्वित करता है, लेकिन नहीं क्रोम 47 में)

कारण यह क्रोम 47 में काम नहीं कर रहा और Firefox रात काम कर रहा है कि ES6 class तों अभी तक पूरी तरह क्रोम में समर्थित नहीं है (यह सुविधा ध्वज के तहत वर्तमान में क्रोम 47 में chrome://flags/#enable-javascript-harmony)

+0

jQuery वादे पर्याप्त मानक हैं (* तब * *) कि 'Promise.all' उन पर काम करता है। – Bergi

+0

@ बर्गि मुझे लगता है कि मैंने मजबूत शब्दों का इस्तेमाल किया, जवाब को सही किया – Bek