2010-02-19 41 views
5

那麼標題kindof說什麼我需要。因爲在JavaScript超時異步我需要知道什麼時候變成真實。我不想busyloop。javascript,等待一些事情成爲真實然後運行動作

趕上了:

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

是好Javascript或我可以做出更好的?

+0

謂詞是什麼? – SLaks 2010-02-19 13:37:29

+0

@predicate是函數,動作也是函數 – zaharpopov 2010-02-19 13:41:29

+0

謂詞是在動作被調用之前必須爲真的條件。 ** ==> **聽起來對我來說很合理。 – AxelEckenberger 2010-02-19 13:42:43

回答

0

它是足夠的,如果它很容易閱讀,它工作得很好,那麼它通常是很好的JavaScript。

從性能上看,只要設置爲true就會調用函數。因此,無論執行哪個函數以使predicate()返回true,您都可以在最後調用action()。但我肯定這就是你會做的,如果可以的話,對吧?

你也可以看看使用回調函數,在其中註冊一個javascript函數到一個特定的變量或函數參數,當函數運行時它會執行任何函數被設置爲回調變量。

-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; 

你可以在Firefox中試試這個例子

+1

什麼是獲取和設置?這是標準的JavaScript? – zaharpopov 2010-02-19 13:49:33

+1

Getters和setter不能在所有的javascript實現中工作。 – 2010-02-19 13:52:01

+0

這將無法工作更少,你有螢火蟲安裝和打開。 (因爲你使用的是控制檯) – Samuel 2010-02-19 14:05:22

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 

當然,這可能是矯枉過正的例子。因爲它從來沒有列出了明確的(注:我不是一個很好的博客),這裏是使這項工作所需的完整代碼:

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(){...})'。好吧。也許我可以在未來更多地修補它。 – 2010-02-19 14:17:50

相關問題