2010-09-03 16 views
45

मैं एक जावास्क्रिप्ट प्रोग्राम को इसके निष्पादन के कुछ विशेष बिंदुओं में प्रतीक्षा करने के लिए बाध्य करना चाहता हूं जब तक कोई चर बदल नहीं जाता है। क्या इसे करने का कोई तरीका है? मुझे पहले से ही एक एक्सटेंशन मिला है जिसे "कथा जावास्क्रिप्ट" कहा जाता है जो कार्यक्रम को तब तक इंतजार करने के लिए मजबूर करता है जब तक कोई घटना न हो। क्या कोई नया कार्यक्रम बनाने का कोई तरीका है, उदाहरण के लिए "वेरिएबल चेंज इवेंट" उदाहरण के लिए ऑनक्लिक ईवेंट की तरह व्यवहार करता है ..जावास्क्रिप्ट में परिवर्तनीय परिवर्तन के लिए मैं प्रोग्राम कैसे इंतजार कर सकता हूं?

उत्तर

0

नहीं, आपको अपना स्वयं का समाधान बनाना होगा। पर्यवेक्षक डिजाइन पैटर्न या कुछ का उपयोग करने की तरह।

यदि आपके पास चर पर कोई नियंत्रण नहीं है या इसका उपयोग कौन कर रहा है, तो मुझे डर है कि आप बर्बाद हो गए हैं। संपादित करें: या स्किलड्रिक के समाधान का उपयोग करें!

माइक

76

एक त्वरित और आसान समाधान इस प्रकार है:

var something=999; 
var something_cachedValue=something; 

function doStuff() { 
    if(something===something_cachedValue) {//we want it to match 
     setTimeout(doStuff, 50);//wait 50 millisecnds then recheck 
     return; 
    } 
    something_cachedValue=something; 
    //real action 
} 

doStuff(); 
+1

अब संपादित किया गया है, यह हर 50ms की जांच करता है और गैर-बूल के लिए काम करता है।जैसा कि मैंने ऐसा करने का त्वरित और आसान तरीका कहा है, इस लिंक का पालन करें: http://stackoverflow.com/questions/1029241/javascript-object-watch-for-all-browsers (पहले से @mplungjan द्वारा पोस्ट किया गया) और अधिक के लिए गहन समस्या-सबूत समाधान। – aularon

+0

मुझे लगता है कि आपका मतलब था 'कुछ === something_cachedValue'। फिर यह काम करता है: http://jsfiddle.net/pEnYC/ – Skilldrick

+0

@ स्किलड्रिक, हाँ मेरा मतलब था, मैंने इसे ठीक किया। सुधार के लिए धन्यवाद:) – aularon

5

मैं एक आवरण मूल्य बदला जा रहा संभाल लेंगे कि सिफारिश करेंगे। उदाहरण के लिए आप जावास्क्रिप्ट कार्य हो सकता है, इस तरह:

​function Variable(initVal, onChange) 
{ 
    this.val = initVal;   //Value to be stored in this object 
    this.onChange = onChange; //OnChange handler 

    //This method returns stored value 
    this.GetValue = function() 
    { 
     return this.val; 
    } 

    //This method changes the value and calls the given handler  
    this.SetValue = function(value) 
    { 
     this.val = value; 
     this.onChange(); 
    } 


} 

और फिर आप इसे से बाहर एक वस्तु है कि मूल्य है कि आप की निगरानी करना चाहते, और यह भी एक समारोह का आयोजन करेगा कि जब मूल्य हो जाता है बुलाया जाएगा बना सकते हैं बदला हुआ। उदाहरण के लिए, आपको सूचित किया करने के लिए मूल्य में परिवर्तन, और प्रारंभिक मूल्य 10 जब चाहते हैं, तो आप कोड को इस प्रकार लिख होगा:

var myVar = new Variable(10, function(){alert("Value changed!");}); 

हैंडलर function(){alert("Value changed!");} बुलाया जाएगा (यदि आप कोड को देखो) जब SetValue() है बुलाया।

तुम इतनी तरह मूल्य प्राप्त कर सकते हैं:

alert(myVar.GetValue()); 

तुम इतनी तरह मान सेट कर सकते हैं:

myVar.SetValue(12); 

और तुरंत बाद, एक चेतावनी स्क्रीन पर दिखाया जाएगा। देखें कि यह कैसे काम करता है: http://jsfiddle.net/cDJsB/

+0

उत्तर के लिए धन्यवाद, लेकिन यह वही नहीं है जो मैं चाहता हूं। कृपया मेरी टिप्पणी को एकुलरॉन पर देखें! –

15

जावास्क्रिप्ट दुभाषिया एकल थ्रेडेड हैं, इसलिए एक चर कभी नहीं बदल सकता है, जब कोड किसी अन्य कोड में प्रतीक्षा कर रहा है जो परिवर्तनीय नहीं बदलता है।

मेरी राय में यह किसी प्रकार की ऑब्जेक्ट में चर को लपेटने का सबसे अच्छा समाधान होगा जिसमें गेटर और सेटर फ़ंक्शन है। फिर आप उस ऑब्जेक्ट में कॉलबैक फ़ंक्शन पंजीकृत कर सकते हैं जिसे ऑब्जेक्ट के सेटटर फ़ंक्शन कहा जाता है।

function Wrapper(callback) { 
    var value; 
    this.set = function(v) { 
     value = v; 
     callback(this); 
    } 
    this.get = function() { 
     return value; 
    } 
} 

यह आसानी से इस तरह इस्तेमाल किया जा सकता: फिर आप वर्तमान मूल्य को पुनः प्राप्त करने कॉलबैक में गेटर समारोह का उपयोग कर सकते

Object.defineProperty MDN documentation:

<html> 
<head> 
<script type="text/javascript" src="wrapper.js"></script> 
<script type="text/javascript"> 
function callback(wrapper) { 
    alert("Value is now: " + wrapper.get()); 
} 

wrapper = new Wrapper(callback); 
</script> 
</head> 
<body> 
    <input type="text" onchange="wrapper.set(this.value)"/> 
</body> 
</html> 
+2

यदि आप मूल चर पर नियंत्रण प्राप्त कर चुके हैं तो शायद सबसे अच्छा समाधान। – Skilldrick

+0

उत्तर के लिए धन्यवाद, लेकिन यह वही नहीं है जो मैं चाहता हूं। कृपया मेरी टिप्पणी को एकुलरॉन पर देखें! –

+1

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

1

आप गुण उपयोग कर सकते हैं

उदाहरण:

function def(varName, onChange) { 
    var _value; 

    Object.defineProperty(this, varName, { 
     get: function() { 
      return _value; 
     }, 
     set: function(value) { 
      if (onChange) 
       onChange(_value, value); 
      _value = value; 
     } 
    }); 

    return this[varName]; 
} 

def('myVar', function (oldValue, newValue) { 
    alert('Old value: ' + oldValue + '\nNew value: ' + newValue); 
}); 

myVar = 1; // alert: Old value: undefined | New value: 1 
myVar = 2; // alert: Old value: 1 | New value: 2 
संबंधित मुद्दे

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