2009-09-18 3 views
7

(이 질문은 정말 언어에 제한되지 않는다 너무도 다른 언어 솔루션을 제출하여 주시기 바랍니다.)자바 스크립트 방법 체인 도전

는 자바 스크립트에서 이런 식으로 뭔가를 작성하는 것은 가능한 일이 될 것이다 경우 난 그냥 궁금 해서요 : P

: 전통적인 방법이 멍청한 놈 질문 인 경우

// Wait 3 seconds and then say our message in an alert box 
setTimeout(function(){alert("Hello World!");}, 3000); 

죄송 작성하는 것

// Wait 3 seconds and then say our message in an alert box 
wait(3).then(function(){alert("Hello World!");}); 

6,

+0

당신이 질문에 대답했다고 생각합니다 .... 두 번째 코드 블록이 잘못 되었습니까? – Zoidberg

+0

@Zoidberg : 제목은 메소드 체이닝 (method chaining)입니다. 그래서 여기있는 것은 실제로 작동하도록하는 것이 아니라 메소드 체인을 사용하여 작동하도록하는 것입니다. – kizzx2

답변

37

당신은 쉽게 작성할 수 있습니다

function wait(delay) { 
    return { 
    then: function (callback) { 
     setTimeout(callback, delay*1000); 
    } 
    }; 
} 

wait(3).then(function(){alert("Hello World!");}); 

당신이 깊이 가고 싶은 경우에, 나는 당신에 대한 curryingpartial function application, 해당 주제는 정말 흥미로운 읽을 것을 권장합니다.

+0

너무 나를 때려! – Zoidberg

+0

빠른 타이 배지. (또는 그럴 준비가 되셨습니까?) –

+0

@cemkalyoncu : 나는 빠른 타이피스트이고 어디서나 Vim과 같은 에디션을 사용합니다 :-D – CMS

0

OO Javascript를 사용하는 경우 메서드 체인을 수행 할 수 있습니다.

인기있는 JavaScript 프레임 워크 중 일부가이를 수행합니다. jQuery은 일반적으로 값을 반환하지 않는 함수에 대해 jQuery 객체를 반환하여 수행합니다.

2

하나의 객체에서 여러 메소드를 실행하기 위해 체인화가 사용됩니다. 그래서 당신은 오히려 객체와 기능을 고려할 것입니다 거기에 시간 제한 설정 : 폐쇄하지 않고, 또 다른 버전을

Function.prototype.callAfter = function(delay) { 
    setTimeout(this, delay*1000); 
}; 

(function(){alert("Hello World!");}).callAfter(3); 
14

을 : 좀 더 코드

function wait(seconds) { 
    if(this instanceof wait) 
     this.delay = seconds; 
    else return new wait(seconds); 
} 

wait.prototype.then = function(callback) { 
    setTimeout(callback, this.delay * 1000); 
}; 

, 당신도 함수를 반복적으로 호출 할 수 있습니다 :

function wait(seconds) { 
    if(this instanceof wait) 
     this.delay = seconds; 
    else return new wait(seconds); 
} 

wait.prototype.then = function(callback) { 
    setTimeout(callback, this.delay * 1000); 
    return this; 
}; 

wait.prototype.wait = function(seconds) { 
    this.delay += seconds; 
    return this; 
}; 

var start = new Date; 
function alertTimeDiff() { 
    alert((new Date - start)/1000); 
} 

wait(1).then(alertTimeDiff).wait(3).then(alertTimeDiff); 
+0

@Christoph : 당신의 접근 방식이 좋으며 CMS보다 더 포괄적이라고 생각합니다. 그러나 다시 그는 질문에 올바르게 답했고 그에 대한 정확한 답을주었습니다 : p – kizzx2

0

난 그냥 어쩌면 당신이 좋아, 다소 일관성있는 방법으로이 같은 API를 생성하기 위해 little helper을 썼다.

// > npm i mu-ffsm # install node dependency 
var mkChained = require('mu-ffsm'); 

아이디어는 엔트리 함수를 호출하여 유형 S의 일부 초기 상태로 유창 빌더를 구축한다는 것이다. 그런 다음 각 연결된 통화는 상태를 새로운 상태로 전환합니다. .

당신이 전달 그 상태에서 값 및 옵션을 구성 할 출구를 호출하는 기능으로 수행 할 수 호출 한 무리의 체인에서 얻을 값

  • 항목 : * ⟶ S
  • 전이 (S ⟶ *)가 ⟶
  • 출구 S : S ⟶ (* ⟶ *)

그래서 0, 1은 항목, 종료 기능입니다. 다른 모든 기능은 내부 상태로 전환됩니다. 모든 함수는 인수를 취할 수 있습니다.우리는 우리의 새로 제작 된 API의 인스턴스를 생성 opt

,

var call = API() // entry 
    .whut()  // transition 
    .then()  // transition 
    .whut();  // transition 

그리고

var result0 = call() // exit 
    , result1 = call() // exit 

를 호출이 구현하는 방법을 볼 수있는 (작은) source에서보세요.

ps. 이 대답을 사용하여 문서를 업데이트하십시오 : D

+0

왜 투표가 실패 했습니까? – wires