पहले तर्क के रूप में त्रुटि या त्रुटि के लिए अलग-अलग कॉलबैक?


12

हम और जेएस एसओ चैट रूम) ने कुछ दिनों पहले @ लिटल के साथ अपनी लिटिल-एक्सएचआर लाइब्रेरी के बारे में त्रुटि से निपटने के बारे में बात की थी ।

मूल रूप से, हम यह तय करना चाहते थे कि किस त्रुटि हैंडलिंग पैटर्न का उपयोग किया जाना चाहिए:

xhr.get({
    // Some parameters, and then
    success: function(data) {},
    failure: function(data) {}
})

या:

xhr.get({
    // Some parameters, and then
    callback: function(err, data) {}
})

एक अधिक jQuery की तरह है, जबकि दूसरा अधिक Node- जैसा है। कुछ लोग कहते हैं कि पहला पैटर्न आपको त्रुटि से निपटने के बारे में अधिक सोचने देता है। मुझे लगता है कि विपरीत, चूंकि आप अन्य कॉलबैक फ़ंक्शन को भूल सकते हैं, जबकि तर्क हमेशा दूसरे पैटर्न पर होता है।

इन दोनों पैटर्न के बारे में कोई राय / फायदा / खामी?


xhr.get({ ... }, function (err, data) {})कम से कम पैटर्न सही हो
Raynos

जवाबों:


5

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

मैं व्यक्तिगत रूप से पसंद करता हूं

(err, data)क्योंकि यह चीजों को संभालने का एक मानक तरीका है। यह फंक्शन कंपोजिशन के लिए अनुमति देता है।

उदाहरण के लिए after.mapइस पैटर्न का उपयोग करता है। तो कोड की तरह

after.map(["foo.js", "bar.js"], function (fileName, callback) {
    fs.readFile(fileName, function (err, file) {
        callback(err, file)
    })
}, function (err, files) {
    // handle files
})

को सरल बनाया जा सकता है

after.map(["foo.js", "bar.js", fs.readFile, function (err, files) {
    // handle files
})

एक और लाभ यह है कि आप कॉलबैक में अंतिम पैरामीटर के रूप में पास कर सकते हैं

asyncOperation(options, function (err, data) {
    // not nested inside an object literal
})

कॉलबैक अंतिम दृष्टिकोण एक अच्छा एपीआई परिचित दृष्टिकोण है।

एक और लाभ यह है कि आप आसानी से errorहैंडलर को अपने ऑब्जेक्ट शाब्दिक में सेट करना भूल सकते हैं , या इसे किसी प्रकार की डिफ़ॉल्ट त्रुटि हैंडलर पर सेट कर सकते हैं ।

जब आपका उपयोग (err, data)करना आपको यह सोचने के लिए याद दिलाता है कि हर बार इस कुशलता से कैसे कुशलता से संभालना है।


2

आम तौर पर, मुझे यह याद रखना पसंद है कि स्पष्ट हमेशा निहित से बेहतर होता है।

इसका उपयोग करते हुए, मैं आम तौर पर स्पष्ट successऔर failureकार्यों के साथ पक्ष रखता हूं - आप जानते हैं कि आप उस पल से निपट रहे हैं जो आप उस कोड को खोलते हैं - सफलता के सौदे सफलतापूर्वक समाप्त हो गए कॉल करते हैं, जबकि त्रुटि उन कॉल से निपटती है जिनमें समस्या थी।

विकल्प, एक विधि का उपयोग करते हुए, आपको उस कोड को संशोधित करने के लिए जाने में अधिक समय लगेगा। इसके अलावा, आप संभवतः कुछ इस तरह से समाप्त करेंगे;

xhr.get({
    callback: function(err, data) {
        if (err) {
            // handle that error somehow
        }
        else {
            // deal with success somehow
        }
    }
})

और उस तरह का बॉयलरप्लेट उबाऊ, तेज होता है।

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


अपने लापता को एक त्रुटि कॉलबैक देखने के लिए कठिन है और अपने पहले errपैरामीटर को नहीं देखना आसान है
Raynos

2

अलग कॉलबैक

यदि xhr.get()कॉल सफल होता है, तो errबेमानी है। यदि कॉल विफल रहता है। dataबेमानी है। ग्राहक कोड को एक या दूसरे की स्थिति की जांच करने के लिए मजबूर करने के बजाय, दोनों को पास न करें।

यदि यह पता चलता है कि सफलता आंशिक सफलता का प्रतिनिधित्व कर सकती है, तो अलग से इंगित करें। विफलता आमतौर पर जमानत का विकल्प है।

मैंने ऐसे डेवलपर्स के साथ काम किया है जो कभी भी सफलता के मामले को संभालते हैं और कई मामलों में बस इस मामले में एक सफलता कॉलबैक को लागू करना पर्याप्त होगा। एक मल्टी-स्टेट कॉलबैक प्रोग्रामिंग की उस शैली के लिए भयावह विकल्प होगा क्योंकि वे सफलता प्राप्त करेंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.