2013-06-25 5 views
5

jQuery में, यदि आप अपने AJAX कॉलबैक विधि में कोई गलती करते हैं, तो आपको एक उचित कंसोल त्रुटि संदेश और स्टैकट्रैक मिलेगा।डोजो - निलंबन में संदर्भ त्रुटि अपवाद

$.get("https://api.github.com/users/octocat/orgs", function() { 
    var a = FAIL; 
}); 

हालांकि, डोजो/अनुरोध/XHR का उपयोग कर डोजो में यह इन गूंगा गलतियों पूरी तरह से निगल लिया जा रहा है लगता है। जब मैं इसे चलाता हूं तो मेरे कंसोल में एकमात्र चीज "तब" और "हमेशा" होती है।

require(["dojo/request/xhr" ], function(xhr) { 
    var promise = xhr.get("https://api.github.com/users/octocat/orgs"); 
    promise.then(function(data) { 
     console.log('then'); 
     var a = FAIL; 
     console.log('goodbye'); 
    }, function() { 
     console.log('error'); 
    }); 
    promise.otherwise(function() { 
     console.log('otherwise'); 
    }); 
    promise.always(function() { 
     console.log('always'); 
    }); 
}); 

बहिष्कृत dojo.xhrGet का उपयोग करके, समस्या बहुत कम सुधार हुई है। मैं एक कंसोल त्रुटि संदेश मिलता है और मेरे त्रुटि हैंडलर कहा जाता है लेकिन यह केवल कहते हैं, "ReferenceError {}" और मुझे एक स्टैक ट्रेस कि कभी नहीं एक समारोह मैं खुद के लिए अंक के साथ प्रदान करता है:

dojo.xhrGet({ 
    url: "https://api.github.com/users/octocat/orgs", 
    load: function() { 
     console.log('dojo.xhrGet.load'); 
     var a = FAIL; 

     console.log('goodbye dojo.xhrGet.load'); 
    }, 
    error: function() { 
     console.log('dojo.xhrGet.error'); 
    }, 
    handle: function() { 
     console.log('dojo.xhrGet.handle'); 
    } 
}); 

जब एक कार्यक्रम हम लेखन गलतियों, यह अच्छा है कि हमारे पास उन गलतियों को इंगित करने के लिए क्रोम डेवलपर टूल जैसे टूल्स हैं। जब आप कोई स्टैकट्रैक और त्रुटि संदेश देख सकते हैं तो त्रुटि खोजने में लगने वाला समय स्पष्ट रूप से बहुत तेज़ होता है यदि आपको कोई प्रतिक्रिया नहीं मिलती है। मुझे डोजो में कोई प्रतिक्रिया नहीं मिली, मुझे विश्वास नहीं है कि इस तरह की एक लोकप्रिय पुस्तकालय इस तरह से काम कर सकती है। मैं क्या गलत कर रहा हूं?

उत्तर

4

वादे जो आप jQuery से विरासत में मिली की समझ मौलिक एक हर किसी के लिए अलग है (जाँच वादे/ए + कार्यान्वयन) है। इस बाकी जवाब के लिए मैं वादे/एक + अनुरूप वादे के बारे में बात करूंगा। डोजो का डिफरर्ड वास्तव में एक + अनुपालन नहीं है, लेकिन यह काफी करीब है कि यहां जो कुछ भी मैं चर्चा करता हूं वह समान रूप से अच्छी तरह से लागू होता है।

वादे अपरिवर्तनीय हैं, आप then पर कॉल करके वादे राज्य को नहीं बदल सकते हैं। एक वादा एक अंतिम मूल्य का प्रतिनिधित्व करता है, यह कहकर बकवास बदलने में सक्षम होना चाहिए कि "एक बार मूल्य तैयार हो जाने पर, ऐसा करें"।

तो उम्मीद है कि यह बताता है कि आपके त्रुटि हैंडलर का आह्वान क्यों नहीं किया जाता है, लेकिन त्रुटियों को पकड़ने का मूल विचार अभी भी पूरी तरह से संभव है। आपको केवल वापसी मूल्यों का उपयोग करने की आवश्यकता है। जब आप एक वचन पर then पर कॉल करते हैं, तो यह एक नया और (लगभग हमेशा) अलग-अलग वादे देता है। यह नया वादा बहुत खास है, यदि मूल हल हो गया है, और आपके द्वारा पारित सफलता हैंडलर का आह्वान किया जाता है, और यह कुछ देता है, तो दूसरा वादा का संकल्प मूल्य कुछ होगा।

समान रूप से, यदि त्रुटि हैंडलर (पहले वादे पर) ट्रिगर किया गया है, और वह फ़ंक्शन कुछ देता है, तो यह दूसरा वादा का संकल्प मूल्य होगा। फेंकने वाली त्रुटियों के लिए भी यही सच है, वे त्रुटि हैंडलर (दूसरे वादे के!) को पास कर दिए जाते हैं।

तो यहाँ अपने पहले कोड नमूना एक और अधिक वादों/एक + रास्ते में लिखा है:

require(["dojo/request/xhr" ], function(xhr) { 
    var promise = xhr.get("https://api.github.com/users/octocat/orgs"); 
    promise.then(function(data) { 
     console.log('then'); 
     var a = FAIL; 
     console.log('goodbye'); 
    }, function() { 
     console.log('error'); 
    }).then(null, function() { 
     console.log('otherwise'); 
    }); 

    promise.always(function() { 
     console.log('always'); 
    }); 
}); 

मैं सच में समझ में नहीं आता क्या आप हमेशा समारोह के साथ क्या करना चाहते हैं, तो मुझे यकीन है कि जहां नहीं था उस जगह को रखें। कॉल स्टैक्स के विषय पर, मैं क्यू वादा लाइब्रेरी की जांच करने की सिफारिश करता हूं जिसमें अविश्वसनीय रूप से उन्नत एसिंक्रोनस कॉल स्टैक समर्थन है।

+0

यह क्या हो रहा है इसका एक बड़ा स्पष्टीकरण है। यहां आपके कोड में थोड़ा बदलाव आया है जो एक स्टैकट्रैक भी देता है: http://jsfiddle.net/5rHM6/ दुर्भाग्य से स्टैक ट्रेस सही रेखा को इंगित नहीं करता है (यह कंसोल.error लाइन को इंगित करता है)। तो यदि आप त्रुटि पकड़ना चाहते हैं, तो यह सही जवाब है; अगर आप त्रुटि खोजना चाहते हैं तो मैं अपना जवाब चुनने के इच्छुक हूं। हालांकि ऐसा लगता है कि यदि आप त्रुटि पकड़ते हैं तो उपकरण दबा दिया जाता है ताकि आप दोनों दुनिया के सर्वश्रेष्ठ न हो। –

+0

आप सही हैं, स्टैक ट्रेस के साथ पूर्ण त्रुटि फेंकने वाली सेवा के विरोध में यह एक संदेश गुजरने वाली सेवा ("एक त्रुटि हुई") है। मैं आपको क्यू लाइब्रेरी की जांच करने का आग्रह करता हूं, यह सबसे अच्छी एसिंक्रोनस लाइब्रेरी है जिसे मैं जानता हूं और वे निश्चित रूप से इस समस्या से निपटते हैं। –

4

डोजो कॉन्फिग सेट में उपयोग किए गए डिफर्ड इंस्ट्रुमेंटेशन: सत्य। यहां an example है।

 <script> 
      var dojoConfig = { 
       useDeferredInstrumentation: true 
      }; 
     </script> 
     <script src="js/lib/dojo/dojo.js.uncompressed.js"></script> 

यह console.error पर एक काफी कार्यात्मक त्रुटि संदेश और स्टैकट्रेस उत्पादन देता है:

ReferenceError {} "ReferenceError: FAIL is not defined 
    at http://fiddle.jshell.net/gNdCb/2/show/:25:17 
    at signalListener (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14205:21) 
    at signalWaiting (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14196:4) 
    at resolve (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14360:5) 
    at signalDeferred (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14249:15) 
    at signalListener (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14220:6) 
    at signalWaiting (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14196:4) 
    at resolve (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14360:5) 
    at signalDeferred (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14249:15) 
    at signalListener (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14226:4) 
    ---------------------------------------- 
    rejected at signalDeferred (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14252:15) 
    at signalListener (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14223:5) 
    at signalWaiting (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14196:4) 
    at resolve (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14360:5) 
    at signalDeferred (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14249:15) 
    at signalListener (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14220:6) 
    at signalWaiting (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14196:4) 
    at resolve (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14360:5) 
    at signalDeferred (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14249:15) 
    at signalListener (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14226:4) 
    ---------------------------------------- 
Error 
    at Promise.then.promise.then (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:14420:24) 
    at http://fiddle.jshell.net/gNdCb/2/show/:23:13 
    at runFactory (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:1117:43) 
    at execModule (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:1245:5) 
    at http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:812:7 
    at guardCheckComplete (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:1260:5) 
    at contextRequire (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:811:6) 
    at req (http://ajax.googleapis.com/ajax/libs/dojo/1.9.0/dojo/dojo.js.uncompressed.js:137:11) 
    at http://fiddle.jshell.net/gNdCb/2/show/:21:1" 
+0

बेशक यह वास्तव में खिड़की की तरह कुछ त्रुटियों को पकड़ने या संभालने में सक्षम होना अच्छा होगा। आतंक। कोई सुझाव? –

+0

त्रुटि को पकड़ने के लिए @ डेविड मैकमुलिन के जवाब को देखें –

0

मेरे पास की आवश्यकता है ब्राउज़र की लागू होने वाली देशी पकड़ खंड को हिट करने के अपवाद के लिए मुझे बहुत विशिष्ट आवश्यकताएं थीं। कोई बात नहीं मैं ऐसा क्यों की जरूरत है, लेकिन मैं कुछ इस तरह इस्तेमाल किया: यह

var promise = xhr.get("https://api.github.com/users/octocat/orgs"); 
promise.then(scream(function(data) { 
    //do stuff 
})); 

उपयोग करने के लिए setTimeout का उपयोग करके

function scream(func) { 
    return function() { 
     var args = arguments; 
     setTimeout(function(){ 
      func.apply(null, args); 
     }, 0); 
    }; 
} 

फिर, आप ब्राउज़रों घटना कतार पर समारोह को अंजाम, इसके लिए असंभव बना अपने अपवाद निगलने के लिए डोजो। लेकिन, सामान्य रूप में यह एक बुरा हल है क्योंकि:

  • यह स्टैक ट्रेस के हिस्से में परिवर्तन
  • इसे अपने कोड का एक हिस्सा है जो पिछले तुल्यकालिक को एसिंक्रोनस रूप से निष्पादित, जो कार्यक्रम व्यवहार को बदल सकते
  • किए गए बदलाव एकाधिक श्रृंखला नहीं कर सकते हैं। तो() वादा वस्तुओं को वापसी मूल्य के लिए वादा करता है, जो वादे के बारे में वास्तव में अच्छी चीजों में से एक है।

वैसे भी, मैं इसे विकल्प के रूप में पेश कर रहा हूं।

संबंधित मुद्दे