2010-02-19 3 views
5

글쎄, 제목 종류가 내가 필요한 것을 말하고 있습니다. Javascript 시간 초과 비동기에서 뭔가가 사실이 될 때를 알 필요가 있기 때문에. 나는 부잣집을 원하지 않는다.자바 스크립트, 뭔가가 사실이 될 때까지 기다렸다가 조치를 취하십시오.

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

이 좋은 자바 스크립트 아니면 내가 더 잘 할 수 있습니다 :

이 함께했다? 그것을 읽을 수있을만큼 쉽게하고 그 다음 잘 작동 그것은 일반적으로 좋은 자바 스크립트의 경우

+0

술어 란 무엇입니까? – SLaks

+0

@predicate는 function이고 action도 function입니다. – zaharpopov

+0

술어는 조치가 호출되기 전에 참이어야하는 조건입니다. ** ==> ** 나에게 소리가납니다. – AxelEckenberger

답변

0

그것은 충분히 괜찮은입니다.

성능 현명한, 그것은 사실 일이 설정되어 어떤 때마다 함수를 호출하기 위해 일반적으로 좋습니다. 따라서 predicate()을 반환하는 함수가 무엇이든 true이면 끝에 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; 

firefox에서이 예를 시도해 볼 수 있습니다.

+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 

이 당신의 예를 들어 과잉 될 수 있습니다. (나는 아주 좋은 블로거 아니다 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 기능)의 사용 나는 한 번 프로젝트에 썼다. 다시 말하지만,이 또는 당신의 필요를 위해 과도하지 않을 수 있습니다 ( 전에! 오 D'. jQuery를 사용자 정의 이벤트를 지원 실현),하지만 난 그게 재미있는 해킹 생각했다. 즐겨!

+0

, 당신이'observable.propToWatch.observe 쓸 수 있으면 좋겠다 (함수() {...})'. 오 잘. 어쩌면 나는 더 많은 것을 미래에 그것과 더 어울리게 할 수있다. –

관련 문제