2013-02-12 36 views
21

मैं कुछ जेएस कोड लिख रहा हूं जो वादे का उपयोग करता है। उदाहरण के लिए, मैं एक फॉर्म पॉप-अप खोलता हूं और मैं jQuery Deferred ऑब्जेक्ट देता हूं। यह इस तरह से काम करता है: उपयोगकर्ता प्रपत्र पर ठीक क्लिक करता हैमुझे एक वादा कब अस्वीकार करना चाहिए?

  • हैं, और यह एक वस्तु प्रपत्र डेटा का प्रतिनिधित्व करने के लिए पुष्टि आस्थगित हल करता है।

  • यदि उपयोगकर्ता रद्द करें क्लिक करता है, तो डिफरर्ड एक शून्य को हल करता है।

जो मैं तय करने का प्रयास कर रहा हूं उसे हल करने के बजाए डिफरर्ड को अस्वीकार कर देना चाहिए? आम तौर पर, मैं सोच रहा हूं कि मुझे किसी शून्य वस्तु की तरह कुछ हल करना चाहिए, और मुझे कब अस्वीकार करना चाहिए?

// Resolve with null. 
var promise = form.open() 
    .done(function (result) { 
     if (result) { 
      // Do something with result. 
     } else { 
      // Log lack of result. 
     } 
    }); 

// Reject. 
var promise = form.open() 
    .done(function (result) {    
     // Do something with result.    
    }) 
    .fail(function() { 
     // Log lack of result. 
    }); 
+0

एक डिजाइन निर्णय की तरह लगता है जो किसी भी तरह से मान्य है। –

+0

मुझे नहीं लगता कि एक विधि दूसरे की तुलना में बेहतर है, लेकिन मैं आमतौर पर किसी गलत मूल्य के बजाय 'असफल' को जोड़ता हूं जैसे किसी चुने हुए मूल्य के बजाय अपवाद, यानी वादा पूरा करने के बजाय वादे को पूरा करने में विफलता एक निश्चित मूल्य के साथ। –

+0

@ExplosionPills हाँ, यही वह है जिसे मैं संभालने की कोशिश कर रहा हूं। तो मुझे अपवाद के रूप में एक ही गंभीरता के रूप में एक वादे अस्वीकृति का इलाज करना चाहिए? – cdmckay

उत्तर

4

आपकी दो रणनीतियों के अर्थशास्त्र वास्तव में समान नहीं हैं। स्पष्ट रूप से स्थगित अस्वीकार करना अर्थपूर्ण है।

उदाहरण के लिए, $.when() जब तक स्थगित वस्तुओं को पारित किया जाता है तब तक संचय परिणाम जारी रहेगा, लेकिन विफल होने वाले पहले व्यक्ति पर जमानत होगी।

इसका मतलब है कि, अगर हम अपने दो वादों promise1 और promise2 क्रमशः नाम बदलने:

$.when(promise1, promise2).then(function() { 
    // Success... 
}, function() { 
    // Failure... 
}); 

ऊपर कोड इंतजार करेंगे जब तक दूसरा रूप से बंद कर दिया है, जिसमें पहला रूप है, को रद्द कर दिया है, भले ही से एक लागू करने से पहले कॉलबैक then() पर पास हो गया। आह्वान कॉलबैक (सफलता या विफलता) केवल दूसरे रूप के परिणाम पर निर्भर करेगा।

हालांकि, यह कोड दूसरा फॉर्म रद्द होने पर विफलता कॉलबैक का आह्वान करने से पहले बंद होने वाले पहले फॉर्म के लिए का इंतजार नहीं करेगा।

2

चूंकि यह उपयोगकर्ता के नियंत्रित है, मैं इसे एक "विफलता" के रूप में इलाज नहीं होगा:

यहाँ कुछ दो स्थानों का प्रदर्शन कोड है। पहला विकल्प क्लीनर लगता है।

0

ठीक है, दोनों मामलों में आप कुछ अलग करेंगे, इसलिए मैं हमेशा कहूंगा कि इसे हल करें या इसे अस्वीकार कर दें। संकल्प पर अपना फॉर्म पोस्ट करें, और अस्वीकार करने पर कुछ भी नहीं करें। फिर, हमेशा, फॉर्म को बंद करें।

var promise = form.open() 
.done(function (result) {    
    // Do something with result.    
}) 
.fail(function() { 
    // Log lack of result. 
}) 
.always(function() { 
    // close the form. 
}) 

यदि आप रद्द करने से इनकार नहीं कर रहे हैं, तो आप कभी भी कब अस्वीकार कर रहे हैं? उस बिंदु पर, एक स्थगित वस्तु का उपयोग क्यों करें? आप इनपुट त्रुटि पर अस्वीकार कर सकते हैं, लेकिन फिर यदि आप उन्हें ठीक करने की अनुमति देना चाहते हैं तो आपको एक नया वादा उत्पन्न करना होगा।


डिफरर्ड वास्तव में यहां उपयोग करने के लिए सही चीज़ की तरह नहीं लगते हैं। मैं सिर्फ घटनाओं का उपयोग करता हूं।

+0

क्या आपको हमेशा वादे का उपयोग करने के लिए अस्वीकार करने की आवश्यकता है? – cdmckay

+0

मुझे लगता है कि स्थिति के आधार पर नहीं। –

+0

वादे घटनाओं की तुलना में हमेशा बेहतर होते हैं जब यह एक एकल एसिंक ऑपरेशन होता है। आप उन वादों पर संयोजक का उपयोग कर सकते हैं जिन्हें आप घटनाओं के साथ नहीं कर सकते हैं। – ForbesLindesay