दिलचस्प पोस्ट
सर्वर एंड्रॉइड को छवियां अपलोड करना हास्केल के साथ आरंभ करना मैं Rails में मॉडल की तालिका-नाम मैपिंग को स्पष्ट रूप से कैसे निर्दिष्ट करूँ? एक फाइल और एसोसिएटेड डाटा पोस्टिंग एक रेंटल वेबएस सेवा को अधिमानतः JSON के रूप में Android.app Fragments बनाम android.support.v4.app ViewPager का उपयोग कर रहा है? JSF संमिश्र घटक में जावास्क्रिप्ट को एकीकृत करें, स्वच्छ तरीके से एचटीएमएल 5 कैनवास में क्रॉस-मूल डेटा टी-एसक्यूएल के साथ एक तारीख बनाएं कैसे एक Win32 प्रक्रिया अपने माता पिता के pid मिलता है? अद्वितीय समाधान के साथ सुडोकू बोर्ड कैसे उत्पन्न करें क्लाइंट पर केवल मॉडल फॉर्म का उपयोग करके jqGrid पर नई पंक्ति जोड़ना मिलिसेकंड को "hh: mm: ss" प्रारूप में कनवर्ट कैसे करें? मापांक और रैंड कैसे काम करता है? नोड.जेएस में समानांतर निष्पादन समन्वयित करना डेटाबेस को हैश को सहेजने के लिए पटरियों का उपयोग करें serialize

जावास्क्रिप्ट सेटइनर्वर और `यह` समाधान

मुझे अपने सेट setInterval हैंडलर से this तक पहुंच की आवश्यकता है

 prefs: null, startup : function() { // init prefs ... this.retrieve_rate(); this.intervalID = setInterval(this.retrieve_rate, this.INTERVAL); }, retrieve_rate : function() { var ajax = null; ajax = new XMLHttpRequest(); ajax.open('GET', 'http://xyz.com', true); ajax.onload = function() { // access prefs here } } 

मैं ajax.onload में इस ajax.onload उपयोग कैसे कर सकता हूं?

वेब के समाधान से एकत्रित समाधान "जावास्क्रिप्ट सेटइनर्वर और `यह` समाधान"

सेट इन्टरलाइन लाइन इस तरह दिखनी चाहिए: –

  this.intervalID = setInterval( (function(self) { //Self-executing func which takes 'this' as self return function() { //Return a function in the context of 'self' self.retrieve_rate(); //Thing you wanted to run as non-window 'this' } })(this), this.INTERVAL //normal interval, 'this' scope not impacted here. ); 

संपादित करें : वही सिद्धांत " onload " पर लागू होता है इस मामले में इसके "बाहरी" कोड के लिए थोड़ा सा काम करना है, यह केवल अनुरोध सेट करता है और फिर उसे भेजता है। इस मामले में उपरोक्त कोड के रूप में अतिरिक्त ओवरहेड एक अतिरिक्त कार्य है जो अनावश्यक है। आपके पुनः प्राप्त_एटर को इस तरह दिखना चाहिए: –

 retrieve_rate : function() { var self = this; var ajax = new XMLHttpRequest(); ajax.open('GET', 'http://xyz.com', true); ajax.onreadystatechanged= function() { if (ajax.readyState == 4 && ajax.status == 200) { // prefs available as self.prefs } } ajax.send(null); } 
 this.intervalID = setInterval(this.retrieve_rate.bind(this), this.INTERVAL); 

सेट setInterval का डिफ़ॉल्ट व्यवहार वैश्विक संदर्भ से setInterval है। आप वर्तमान संदर्भ की एक प्रतिलिपि सहेजकर सदस्य फ़ंक्शन कॉल कर सकते हैं। इन चर को प्राप्त करने के अंदर ठीक से मूल संदर्भ के लिए बाध्य किया जाएगा। आपका कोड ऐसा दिखता है:

 var self = this; this.intervalID = setInterval( function() { self.retrieve_rate(); }, this.INTERVAL); 

बोनस टिप: एक सादा फ़ंक्शन संदर्भ के लिए (किसी वस्तु संदर्भ के विपरीत जो एक सदस्य फ़ंक्शन है) आप जावास्क्रिप्ट के call का उपयोग करके या विधि apply कर apply

ब्राउज़र समर्थन को सुधारने के साथ, समय ठीक से ईकामास्क्रिप्ट 6 एन्हांसमेंट, एरो => विधि का उपयोग करने के लिए अच्छा है, this ठीक से संरक्षित करने के लिए

 startup : function() { // init prefs ... this.retrieve_rate(); this.intervalID = setInterval( () => this.retrieve_rate(), this.INTERVAL); }, 

retrieve_rate() को अंतराल के द्वारा बुलाया जाता है तो => विधि का उपयोग करके this संरक्षित किया जाता है। कायरता स्वयं के लिए कोई ज़रूरत नहीं है या this पैरामीटर में गुजर रहा है

window.setInterval(function(){console.log(this)}.bind(this), 100)

यह जावास्क्रिप्ट में कानूनी है और बहुत सी कोड बचाता है 🙂

 prefs: null, startup : function() { // init prefs ... this.retrieve_rate(); var context = this; this.intervalID = setInterval(function() { context.retrieve_rate(); }, this.INTERVAL); }, retrieve_rate : function() { var ajax = null; ajax = new XMLHttpRequest(); ajax.open('GET', 'http://xyz.com', true); var context = this; ajax.onload = function() { // access prefs using context. // eg context.prefs } } 

यह सबसे साफ समाधान होगा, चूंकि अधिकांश समय आप वास्तव में अपने संदर्भ पद्धति कॉल के लिए इस संदर्भ को बदलना चाहते हैं:

इसके अलावा अवधारणा को समझना भी आसान है।

  // store scope reference for our delegating method var that = this; setInterval(function() { // this would be changed here because of method scope, // but we still have a reference to that OURMETHODNAME.call(that); }, 200); 

यह एक सौंदर्य समाधान नहीं है लेकिन यह आम उपयोग में है:

 var self = this; var ajax = null; //... ajax.onload = function() { self.prefs....; }