2010-02-19 13 views
5

खैर शीर्षक टाइप करता है जो मुझे चाहिए। चूंकि जावास्क्रिप्ट टाइमआउट एसिंक्रोनस में मुझे कुछ पता होना चाहिए कि कुछ कब सच हो जाता है। मैं busyloop नहीं चाहता।जावास्क्रिप्ट, कुछ सच होने की प्रतीक्षा करें, फिर कार्रवाई करें

function do_when(predicate, action, timeout_step) { 
    if (predicate()) { 
     action(); 
    } else { 
     setTimeout(do_when, timeout_step, predicate, action, timeout_step); 
    } 
} 

यह अच्छा जावास्क्रिप्ट है या मैं बेहतर कर सकते हैं:

के साथ आया?

+0

भविष्यवाणी क्या है? – SLaks

+0

@ भविष्यवाणी कार्य है, कार्रवाई भी कार्य करती है – zaharpopov

+0

भविष्यवाणी वह स्थिति है जब कार्रवाई को कॉल करने से पहले यह सच होना चाहिए। ** ==> ** मुझे आवाज लगती है। – AxelEckenberger

उत्तर

0

यह काफी सभ्य है, अगर इसे पढ़ने में काफी आसान है और यह ठीक काम करता है तो यह आमतौर पर अच्छा जावास्क्रिप्ट होता है।

प्रदर्शन के अनुसार, जब भी सत्य पर सेट किया जाता है तो कार्य को कॉल करना आम तौर पर बेहतर होता है। तो predicate() को वापस करने के लिए निष्पादित करने वाले किसी भी फ़ंक्शन में, आप अंत में action() पर कॉल कर सकते हैं। लेकिन मुझे यकीन है कि अगर आप कर सकते हैं तो आप यही करेंगे, है ना?

आप कॉलबैक का उपयोग करने पर भी देख सकते हैं, जहां आप एक विशेष चर या फ़ंक्शन तर्क में जावास्क्रिप्ट फ़ंक्शन पंजीकृत करते हैं और जब फ़ंक्शन चलाया जाता है तो यह कॉलबैक चर पर जो भी फ़ंक्शन सेट किया जाता है उसे निष्पादित करता है।

-1

अपने विधेय सच हो जाते हैं जब एक चर परिवर्तन, यहाँ एक और समाधान है अगर:

कहते हैं कि हम प्रवेश करने के लिए 'बिग भाई आप देख रहा है' जब वस्तु के मूल्य एक हो जाते हैं चाहते हैं 2.

function observable (value, condition, callback){ 
    this.value = value; 
    this.condition = condition; 
    this.callback = callback; 
} 

observable.prototype = { 
    get value() { 
     return this._value; 
    }, 
    set value (value) { 
     this._value = value; 
     if (this.condition && this.callback && this.condition (value)) { 
      this.callback (value); 
     } 
    } 
}; 

condition = function (value) { 
    console.log ('condition', value); 
    return value === 2; 
} 

callback = function (value) { 
    console.info ('Big Brother is watching you!'); 
} 

var a = new observable (0, condition, callback); 

console.log ('set value to 1'); 
a.value = 1; 
console.log ('set value to 2'); 
a.value = 2; 
console.log ('set value to 3'); 
a.value = 3; 

आप फ़ायरफ़ॉक्स

+1

क्या मिलता है और सेट है? क्या यह मानक जावास्क्रिप्ट है? – zaharpopov

+1

गेटर्स और सेटर्स सभी जावास्क्रिप्ट कार्यान्वयन में काम नहीं करेंगे। –

+0

यह कम काम नहीं करेगा आपके पास फायरबग स्थापित और खोला गया है। – Samuel

6

में इस उदाहरण को आजमा सकते हैं कि भविष्यवाणी क्या है, आप observer pattern के कार्यान्वयन में अपनी समस्या को फिट करने में सक्षम हो सकते हैं। कुछ समय पहले मैंने creating JavaScript objects with observable properties के बारे में एक ब्लॉग पोस्ट लिखा था। यह वास्तव में क्या विधेय है पर निर्भर करता है, लेकिन यह आप इस तरह के कोड के साथ वहाँ जिस तरह से ज्यादातर मिल सकता है:

var observable = createObservable({ propToWatch: false }); 
observable.observe('propToWatch', function (oldValue, newValue) { 
    alert('propToWatch has changed from ' + oldValue + ' to ' + newValue); 
}); 
observable.propToWatch(true); // alert pops 
बेशक

, यह आपके उदाहरण के लिए overkill हो सकता है। चूंकि यह बाहर स्पष्ट रूप से कभी नहीं सूचीबद्ध है (nb मैं एक बहुत अच्छा ब्लॉगर नहीं हूँ), यहाँ पूरा कोड इस काम बनाने के लिए आवश्यक है:

var createMediator = function() { 
    var events = {}; 
    return { 
     subscribe: function (eventName, callback) { 
      events[eventName] = events[eventName] || []; 
      events[eventName].push(callback); 
     }, 
     publish: function (eventName) { 
      var i, callbacks = events[eventName], args; 
      if (callbacks) { 
       args = Array.prototype.slice.call(arguments, 1); 
       for (i = 0; i < callbacks.length; i++) { 
        callbacks[i].apply(null, args); 
       } 
      } 
     } 
    }; 
}; 

var createObservable = function (properties) { 
    var notifier = createMediator(), createObservableProperty, observable; 
    createObservableProperty = function (propName, value) { 
     return function (newValue) { 
      var oldValue; 
      if (typeof newValue !== 'undefined' && 
       value !== newValue) { 
       oldValue = value; 
       value = newValue; 
       notifier.publish(propName, oldValue, value); 
      } 
      return value; 
     }; 
    }; 
    observable = { 
     register: function (propName, value) { 
      this[propName] = createObservableProperty(propName, value); 
      this.observableProperties.push(propName); 
     }, 
     observe: function (propName, observer) { 
      notifier.subscribe(propName, observer); 
     }, 
     observableProperties: [] 
    }; 
    for (propName in properties) { 
     observable.register(propName, properties[propName]); 
    } 
    return observable; 
}; 

मेरे नमूदार वस्तुओं बनाने के लिए एक छोटा सा इवेंट फ्रेमवर्क (createMediator समारोह) का आंतरिक रूप से उपयोग मैंने एक परियोजना के लिए एक बार लिखा था। ( से पहले jQuery समर्थित कस्टम इवेंट्स को महसूस करना। डी ओह!) फिर, यह आपकी ज़रूरत के लिए अधिक हो सकता है या नहीं, लेकिन मैंने सोचा कि यह एक मजेदार हैक था। का आनंद लें!

+0

अब जब कि मैं फिर से इस कोड को देखो, काश तुम 'लिख सकता है observable.propToWatch.observe (function() {...})'। ओह अच्छा। शायद मैं भविष्य में इसके साथ कुछ और कर सकता हूं। –

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

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