2011-10-10 5 views
7

this JsFiddle पर एक नज़र डालें:मेरे कोड में ऐसी त्रुटियों की आवृत्ति को कैसे कम किया जाए?

var requests = [ 
    $.ajax("http://search.twitter.com/search.json", { data: { q: 'ashishnjain' }, dataType: 'jsonp' }) 
    .done(function() {console.log("request");}), 

    $.ajax("http://search.twitter.com/search.json", { data: { q: 'ashishnjain' }, dataType: 'jsonp' }) 
    .done(function() {console.log("request");}) 
]; 

$.when(requests).done(console.log("alldone")); 

अपेक्षित आउटपुट है: request request alldone, लेकिन वास्तव में यह प्रिंट alldone request request

वास्तव में इस कोड में दो बग हैं (यदि आप उस तरह की चीज़ का आनंद लेते हैं तो अभ्यास के रूप में छोड़ दिया जाता है), लेकिन आखिर में मुझे लगता है कि ऐसा इसलिए होता है क्योंकि जावास्क्रिप्ट और jQuery दोनों बेहद कमजोर होते हैं जब तर्क दिए जाते हैं जो कुछ भी समझ में नहीं आता है। इस माहौल में, "सही" चीज "कुछ या कुछ भी नहीं करती है, बस एक त्रुटि फेंक न दें!"।

इस कोड गुजरता JsLint, और सिर्फ मुझे (वास्तविक कोड निश्चित रूप से और अधिक जटिल था परिमाण के कुछ आदेश) डिबग करने के लिए कुछ घंटों खर्च किया है के रूप में देखकर, मैं सोच रहा हूँ और क्या मैं करने के लिए क्या कर सकते हैं ऐसी अनचाहे उदारता पर समय बर्बाद करना कम करें। यह एक अलग उदाहरण नहीं है; ऐसा लगता है कि बार-बार ऐसा होता है। कोई सुझाव?

+0

तर्क आपके अनुसार कोई समझ नहीं आता है। इंजन के अनुसार, मुझे यकीन है कि वे करते हैं। आप अपनी "बग" से कौन सी त्रुटियों की अपेक्षा करेंगे? कुछ "अवैध तर्क" की तरह? – bzlm

+0

@bzlm मुझे उस पर चर्चा करना अच्छा लगेगा, लेकिन मुझे डर है कि यह सवाल ट्रैक को खींच देगा। मैं जावास्क्रिप्ट को बदल नहीं सकता, और मैं jQuery (ज्यादा) नहीं बदल सकता, इसलिए मैं सोच रहा हूं कि इस तरह की चीजों से कैसे बचें। –

+1

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

उत्तर

0

लगता है कि आपने समझ लिया

$.when([x,y]) 

$.when(x,y) 

के लिए मुझे नहीं लगता कि वहाँ एक विश्लेषण उपकरण गलती के इस प्रकार को पकड़ने में मदद मिलेगी के बाद से यह पारित करने के लिए पूरी तरह से स्वीकार्य है कब एक सूची यदि आप एक और अधिक प्रतिबंधात्मक समारोह करना चाहते हैं तो आप एक अपने आप बना सकते हैं:

function whenForMoreThanOne(list_of_deferreds){ 
    return $.when.apply($, list_of_deferreds); 
} 
3

यह वास्तव में जावास्क्रिप्ट में क्रम में check types के लिए संभव है, यह सिर्फ है कि सख्त किया जा रहा है जावास्क्रिप्ट में पसंदीदा शैली नहीं है। जेएस हैकर्स इसे ढीला लटका पसंद है।

अन्य हैकर इस के साथ सामना करते हैं, है ना? इसलिए, इस समस्या को डीबग करने में आपके लंबे समय तक भाषा या jQuery को दोष देने के बजाय, मैं आपके डीबगिंग प्रयासों को कम करने के अन्य तरीकों की जांच करने के बजाय सुझाव दूंगा। पहली बार अपने .js फ़ाइल में पेस्ट करने से पहले इंटरैक्टिव जे एस कंसोल में कोड की

  1. टेस्ट बाहर छोटे टुकड़े:

    यहाँ कुछ सुझाव मैं के बारे में सोच सकते हैं इस

    • आप की अनुमति देता है तेजी से पुनरावृति जब तक आप इसे सही (आप $ .जब() उपयोग कैसे करूँ?)
    • सुनिश्चित करता है जब आप इसे सही मिलता है, आप समझते हैं कि कैसे एपीआई
  2. उपयोग करने के लिए
  3. संवर्धन रखें यिंग जेएस, और इसे और अधिक लिखते रहें। आपके द्वारा बनाई गई दूसरी त्रुटि: फ़ंक्शन में console.log ("सभी किया गया") लपेटना नहीं दिखाता है कि जेएस के बारे में एक मूलभूत अवधारणा अभी तक पूरी तरह से बंद नहीं हुई है - एक अनुभवी जेएस हैकर कभी भी यह गलती नहीं करेगा।
+0

'" एक अनुभवी जेएस हैकर कभी भी यह गलती नहीं करेगा "- आप इस बारे में कितने निश्चित हैं? आप इसे केवल इसलिए कह सकते हैं क्योंकि हम हर समय आपकी स्क्रीन नहीं देख सकते हैं। यदि किसी ने देखा कि आप जेएस में एक ही गलती करते हैं, तो एक बार भी, आप एक बड़े पाखंड की तरह दिखेंगे। – Timwi

+1

टाइपिंग जांच केवल प्रकार की त्रुटियों के खिलाफ सुरक्षा होगी। ओपी की गलती वास्तव में एक प्रकार की त्रुटि नहीं है (और $ एक मुद्दा है। जब एक अव्यवस्थित एपीआई है) – hugomg

+2

ओपी की गलती * वास्तव में एक प्रकार की त्रुटि है (कम से कम, 'console.log' को लपेटने के बारे में कोई नहीं होगा प्रकार की जाँच)। मैं एक अनुभवी जेएस हैकर हूं और मैं हर दो सप्ताह में एक बार गलती करता हूं। – Malvolio

1

आपकी अधिक प्रमुख त्रुटि के मामले में, उत्तर दो शब्दों में कहा जा सकता है: static typing। स्टेटिक टाइपिंग हर समस्या को हल नहीं करती है लेकिन यह इन सूक्ष्म असफलताओं को ट्रैक करने में शामिल काम से बाहर एक बड़ा हिस्सा आती है।

स्थिर प्रकारों के डाउनसाइड्स , अनुपलब्ध दावों के रूप में, प्रोग्रामिंग को अधिक कठिन या कम शक्तिशाली या ऐसा कुछ भी करने के साथ करने के लिए कुछ भी नहीं है। सबसे बड़ी समस्या यह है कि किसी भाषा की टाइपिंग प्रणाली की ताकत भाषा की लोकप्रियता के विपरीत भिन्न होती है। स्कैला और हास्केल जैसी बहुत अच्छी टाइप की गई भाषाएं अभी भी स्वीकार्यता के बुटीक स्तर पर हैं। जावा अधिक लोकप्रिय है, लेकिन इसकी टाइप-सिस्टम का उपयोग करना मुश्किल है और छेद से भरा शॉट; सी # के बारे में कुछ भी कहा जा सकता है। बेहद लोकप्रिय PHP की प्रकार प्रणाली एक तटस्थ पर्यवेक्षक को जानबूझकर तबाही के रूप में मार डालेगी। फोर्टन और सी जैसी पुरानी भाषाएं भी कोशिश नहीं करती हैं।

मुझे नहीं पता कि यह क्यों है, लेकिन मुझे पूरा विश्वास है कि स्पष्ट स्पष्टीकरण - लोगों को मजबूत टाइपिंग पसंद नहीं है - सही नहीं है।

एक संबंधित समस्या यह है कि आप अभी तक किसी भी दृढ़ता से टाइप की गई भाषा को जावास्क्रिप्ट पर संकलित नहीं कर सकते हैं। निकटतम दृष्टिकोण शायद GWT है।

+0

रोकथाम की समस्या की अनिश्चितता गारंटी देता है कि अच्छी तरह से व्यवहार किए गए प्रोग्राम हैं जिन्हें स्थिर रूप से एक कंपाइलर द्वारा चेक नहीं किया जा सकता है, इसलिए तकनीकी रूप से स्थैतिक प्रकार एक सीमा हैं: पी लेकिन हाँ, मुझे लगता है कि आप यह पहचानने में सही हैं कि हास्केल ने मुझे भी बनाया है सिस्टम टाइप करने की बात आती है जब picky। – hugomg

+0

@missingno: इसमें रोक समस्या से कोई लेना देना नहीं है। किसी भी कार्यक्रम को व्यक्त करने के लिए आपको ट्यूरिंग-पूर्ण प्रकार की प्रणाली की आवश्यकता नहीं है। यदि आपको आराम से जांच की आवश्यकता है, तो आप हमेशा uber-type 'object' का उपयोग कर सकते हैं। उस पर, सी # में 'गतिशील' प्रकार भी है जो आप चाहते हैं कि बहुत कुछ है। इसके साथ, स्थैतिक टाइपिंग एक अतिरिक्त सुविधा है जो एक अनियमित भाषा प्रदान कर सकती है, और कुछ भी नहीं लेती है। (प्रैक्टिस में, मुझे 'गतिशील' प्रकार बहुत ही कम उपयोगी लगता है।) – Timwi

+0

@ तिमवी: मुझे आशा थी कि मूर्खतापूर्ण स्माइली चेहरे ने स्पष्ट कर दिया होगा कि यह स्पष्ट रूप से शीर्ष पर टिप्पणी थी। – hugomg

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