2010-02-19 29 views
5

Vâng loại tiêu đề nói những gì tôi cần. Bởi vì trong thời gian chờ Javascript không đồng bộ, tôi cần phải biết khi nào đó trở thành sự thật. Tôi không muốn busyloop.javascript, đợi cho một cái gì đó là đúng sau đó chạy hành động

đến với:

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

là nó tốt Javascript hoặc tôi có thể làm tốt hơn?

+0

Vị từ là gì? – SLaks

+0

@predicate là hàm, hành động cũng là hàm – zaharpopov

+0

Vị từ là điều kiện khi điều đó phải đúng trước khi hành động được gọi. ** ==> ** Tìm âm thanh cho tôi. – AxelEckenberger

Trả lời

0

Đó là đủ phong nha, nếu nó dễ dàng, đủ để đọc và nó hoạt động tốt thì nó thường javascript tốt.

Hiệu suất thông minh, thường tốt hơn nên gọi hàm bất cứ khi nào bất kỳ điều gì được đặt thành đúng sẽ xảy ra. Vì vậy, trong bất kỳ chức năng nào thực hiện để thực hiện predicate() trả về true, bạn chỉ có thể gọi action() ở cuối. Nhưng tôi chắc chắn đó là những gì bạn đã làm nếu bạn có thể, phải không?

Bạn cũng có thể xem xét sử dụng gọi lại, nơi bạn đăng ký hàm javascript cho một biến hoặc đối số hàm cụ thể và khi hàm chạy nó thực thi bất kỳ hàm nào được đặt thành biến gọi lại.

-1

nếu vị ngữ của bạn trở thành hiện thực khi một sự thay đổi biến, đây là một giải pháp:

nói rằng chúng ta muốn đăng nhập 'Big anh trai đang theo dõi bạn' khi giá trị của đối tượng một trở 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; 

bạn có thể thử ví dụ này trong firefox

+1

những gì có được và thiết lập? javascript này có tiêu chuẩn không? – zaharpopov

+1

Getters và setters sẽ không hoạt động trong tất cả các triển khai javascript. –

+0

điều này sẽ không làm việc ít hơn bạn đã cài đặt và mở firebug. (bởi vì bạn đang sử dụng giao diện điều khiển) – Samuel

6

Tùy thuộc vào vị từ là gì, bạn có thể phù hợp với vấn đề của mình trong việc triển khai observer pattern. Một thời gian ngắn tôi đã viết một bài đăng blog về creating JavaScript objects with observable properties. Nó thực sự phụ thuộc vào những gì các vị , nhưng điều này có thể giúp bạn có được hầu hết các cách đó với mã như thế này:

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

Tất nhiên, điều này có thể là quá mức cần thiết ví dụ của bạn. Kể từ khi nó chưa bao giờ được liệt kê ra một cách rõ ràng (nb Tôi không phải là một blogger rất tốt), đây là mã hoàn chỉnh cần thiết để thực hiện công việc này:

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

đối tượng quan sát của tôi sử dụng trong nội bộ của một khuôn khổ eventing nhỏ (chức năng createMediator) Tôi đã viết một lần cho một dự án. (Trước khi nhận ra các sự kiện tùy chỉnh được hỗ trợ của jQuery. D'oh!) Một lần nữa, điều này có thể hoặc có thể không vượt quá nhu cầu của bạn, nhưng tôi nghĩ đó là một bản hack thú vị. Thưởng thức!

+0

Bây giờ tôi xem lại mã này, tôi ước bạn có thể viết 'observable.propToWatch.observe (function() {...})'. Oh well. Có lẽ tôi có thể tinker với nó một số chi tiết trong tương lai. –

Các vấn đề liên quan