2012-12-18 9 views
10

मैं एकाधिक बाल दृश्यों के प्रबंधन के लिए एक सामान्य बैकबोन दृश्य बना रहा हूं। मुझे कभी-कभी प्रस्तुत किए जाने से पहले इन विचारों को तैयार करने के लिए तर्क करने की आवश्यकता होती है। मैं रीढ़ की घटनाओं का उपयोग कर एक pre_render हुक सक्षम करने के लिए, इस तरह पर विचार कर रहा हूँ:बैकबोन का ट्रिगर() सिंक्रोनस या असिंक्रोनस है?

view = new (this.child_view); 
this.trigger('pre_render', view); 
view.render(); 

घटनाओं trigger() से बुलाया तुल्यकालिक प्रदर्शन किया जाएगा, इस प्रकार की गारंटी है कि वे render() लाइन से पहले सभी खत्म कहा जाता है होगा?

उत्तर

11

असल में, हाँ, यह तुल्यकालिक है।

trigger: function(name) { 
    if (!this._events) return this; 
    var args = slice.call(arguments, 1); 
    if (!eventsApi(this, 'trigger', name, args)) return this; 
    var events = this._events[name]; 
    var allEvents = this._events.all; 
    if (events) triggerEvents(this, events, args); 
    if (allEvents) triggerEvents(this, allEvents, arguments); 
    return this; 
}, 

आयात समारोह triggerEvents है, जो वास्तव में संचालकों कॉल:

यहाँ स्रोत से प्रासंगिक अनुभाग है। comments के अनुसार, यह केवल एक अनुकूलित प्रेषक है। ध्यान दें कि वे सभी .call() और .apply() पर कॉल कर रहे हैं, इसलिए कॉलर को नियंत्रण वापस करने से पहले कॉलबैक पूरा हो जाएगा।

var triggerEvents = function(obj, events, args) { 
    var ev, i = -1, l = events.length; 
    switch (args.length) { 
    case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); 
    return; 
    case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0]); 
    return; 
    case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1]); 
    return; 
    case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1], args[2]); 
    return; 
    default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); 
    } 
}; 

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

2

हां, वे तुल्यकालिक हैं। हालांकि, इस घटना द्वारा ट्रिगर किया गया एक फ़ंक्शन setTimeout का उपयोग करने के लिए स्वतंत्र है या AJAX अनुरोध करता है और यदि ऐसा है तो trigger कॉल रिटर्न के समय तक पूरा नहीं होगा और कोड render पर कॉल करने के लिए आगे बढ़ेगा। तो हाँ हर बाउंड इवेंट हैंडलर को आमंत्रित किया जाएगा, लेकिन आवश्यक रूप से प्रसंस्करण के पूरे सेट को पूरा नहीं किया है। चूंकि ट्रिगर एपीआई कॉलबैक या वादे का उपयोग नहीं करता है, इसलिए सभी ईवेंट हैंडलर पूर्ण होने पर जानने का कोई सीधा तरीका नहीं है। यदि आवश्यक हो, तो आपको स्वयं को ऐसे एपीआई को लागू करना होगा और किसी भी एसिंक्रोनस प्रोसेसिंग सहित सबकुछ किया जाने पर एक अलग घटना को आग लगाना होगा। हालांकि, दिन-प्रतिदिन प्रोग्रामिंग में, उनमें से अधिकतर ईवेंट हैंडलर सिंक्रोनस होते हैं और यदि नहीं, तो कोड आमतौर पर संरचित किया जाता है जैसे कि आगे बढ़ने से एप्लिकेशन को गलत व्यवहार नहीं किया जाएगा। यदि आपको यह अनुबंध बदलने की ज़रूरत है, तो यह एक कोड गंध है कि आपका एप्लिकेशन डिज़ाइन घटना प्रणाली का उपयोग करके सामंजस्यपूर्ण रूप से उपयोग नहीं कर रहा है और आप अपनी समस्या के विभिन्न दृष्टिकोणों के बारे में सोचना चाह सकते हैं।

1

ट्रिगर स्रोत कोड के अनुसार तुल्यकालिक है, इसका मतलब यह नहीं है कि "pre_render" ईवेंट सुनने वाले सभी फ़ंक्शन सिंक्रोनस ऑपरेशंस करेंगे हालांकि । पुनश्च: स्रोत कोड, वास्तव में पढ़ने के लिए आसान है, आप वास्तव में इसे पर एक नजर है चाहिए:

http://backbonejs.org/docs/backbone.html

+1

मैं निश्चित रूप से एनोटेट स्रोत उपयोगी पाते हैं; इस तरह के सवालों का जवाब देते समय मैं ज्यादातर पेपर ट्रेल छोड़ना पसंद करता हूं। धन्यवाद! –

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