2012-06-17 16 views
9

कोड में इस पैटर्न को देखने पर ध्यान दिया, लेकिन Google या SO, अजीब में इसका कोई संदर्भ नहीं मिला। क्या कोई मुझे इस .async() फ़ंक्शन के संदर्भ में इंगित कर सकता है?यह .async() जावास्क्रिप्ट में क्या करता है

var done = this.async(); 
    // ... 
    $.get(path, function(contents) { // or some other function with callback 
    // ... 
    done(JST[path] = tmpl); 
    }) 
+7

यह कोई अंतर्निहित कार्य नहीं है। यह कुछ पुस्तकालय/ढांचे द्वारा प्रदान किया जाना चाहिए। – user123444555621

उत्तर

1

यह कॉलबैक अंदर से बचने this की समस्या को हल करने के लिए एक रास्ता है। इस अतिरिक्त संदर्भ के बिना कोड इस तरह दिखेगा:

$.get(path, function(contents) { // or some other function with callback 
    //Wrong! `this` might no longer point to your object 
    this.done(JST[path] = tmpl); 
}) 

दुर्भाग्यवश! प्रतिक्रिया कॉलबैक के अंदर this इसके बाहर this जैसा नहीं है। वास्तव में यह कुछ भी हो सकता है, $.get (कॉलबैक का उपयोग करके कॉल करने) के आधार पर यह तय करता है।

var that = this; 
// ... 
$.get(path, function(contents) { // or some other function with callback 
    // ... 
    that.async(JST[path] = tmpl); 
}) 

यह पैटर्न भी उचित और पठनीय लगता है: अधिकांश लोग अतिरिक्त संदर्भ ही उद्देश्य के लिए that नामित उपयोग करें।

ओह, और यदि आप इस वाक्य रचना के बारे में उत्सुक हैं:

done(JST[path] = tmpl) 

यह अभिव्यक्ति के रूप में प्रयोग किया जाता है एक काम है। काम का मूल्य दाएँ हाथ की ओर है, इसलिए इस कोड के बराबर है:

JST[path] = tmpl; 
done(tmpl); 
+4

-1: यह 'this.async() 'के बारे में प्रश्न का उत्तर नहीं देता है और इसके बजाय किसी ऐसे प्रश्न के बारे में बात करता है जो पूछे जाने वाले प्रश्न में भी नहीं होता है। मैं इस बात को स्वीकार कर रहा हूं कि @ टोनी ने इस जवाब को स्वीकार क्यों किया। – fluffy

16

var done = this.async() और done(blah) अतुल्यकालिक कॉल (जैसे $.get) एक तुल्यकालिक समारोह के भीतर से दिलवाया एक मूल्य के वापस जाने के लिए एक चतुर चाल है।

एक उदाहरण देखते हैं:

var getText = function() { 
    return "hello"; 
}; 
var text = getText(); 

यह एक बिल्कुल स्पष्ट समारोह कॉल इसलिए यहाँ कोई पहेली है। हालांकि, अगर आपको getText() फ़ंक्शन में टेक्स्ट को अतुल्यकालिक रूप से लाने की आवश्यकता है तो क्या होगा?

var getText = function() { 
    return $.get('<some-url>', function(text) { 
    return text; 
    }); // ?????? 
}; 

getText() करने के लिए कॉल पाठ आप प्राप्त करना चाहते हैं वापस नहीं करता है। यह jquery के वादे वस्तु देता है।

तो हम getText() कैसे $.get() कॉल से प्राप्त पाठ को वापस कर सकते हैं?

var getText = function() { 
    var done = this.async(); 
    $.get('<some-url>', function(text) { 
    done(text); 
    }); 
}; 
var text = getText(); // you get the expected text 

जादू, है ना?

मुझे अभी तक this.async() कॉल के आंतरिक काम को नहीं पता है। मुझे नहीं पता कि लाइब्रेरी उस फ़ंक्शन को प्रदान करती है या नहीं, लेकिन आप देख सकते हैं कि बैकबोन। LayoutManager इस चाल का उपयोग करता है https://github.com/tbranyen/backbone.layoutmanager/blob/master/backbone.layoutmanager.js (this.async के लिए खोजें)।

इसके अलावा, टिम ब्रैनेन (रीढ़ की हड्डी लेआउटमैनेजर का लेखक) संक्षिप्त रूप से इसके वीडियो ट्यूटोरियल (http://vimeo.com/32765088 के आसपास 14:00 - 15:00) में इसके बारे में बात करता है। वीडियो में, टिम का कहना है कि बेन आलमैन उस चाल के साथ आया था। इस पर एक नज़र डालें https://github.com/cowboy/javascript-sync-async-foreach

मुझे लगता है कि यह एसिंक और सिंक फ़ंक्शन को मिश्रित करने के लिए एक सुंदर साफ चाल है।

चीयर्स,

+0

मैं योनोमन 'जेनरेटर ट्यूटोरियल बनाना (http://yeoman.io/authoring/user-interactions.html) में इस पर आया था। – devboell

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