2015-02-06 9 views
0

거기 체인 (유창한 인터페이스)의 메서드 호출이 해당 체인의 TAIL 위치에 있는지 감지하는 방법이 있습니까?js 메서드 체인 꼬리

var some = g.f(arg1).f(arg2).f(arg3); 

또는 우리가 절대적으로 내가 피하려는

var some = g.f(arg1).f(arg2).f(arg3).end(); 

뭔가를해야합니까?

되돌아온 값은 나에게별로 중요하지 않지만 체인의 끝에서 뭔가 다른 값 (내부 문자열과 같은 키)을 계산해야합니다.

답변

0

아니요, 다음 연결 호출이 아직 발생하지 않았고 해석기가 존재하는지 여부에 대한 어떠한 증거도 제공하지 않기 때문에 함수 호출이 동일하게 보이는 경우 지정된 메서드가 꼬리 위치에 있는지 감지 할 수 없습니다 오는 또 다른 연쇄 호출.


당신은 당신이 찾고있는 단서였다 옵션 두 번째 인수 만들 수

: 두 번째 인수가 존재하고 적절한이 있다면 그런

var some = g.f(arg1).f(arg2).f(arg3, "end"); 

, 당신의 f() 기능은 확인 것 가치가 있다면, 꼬리 작업을 수행 할 수 있습니다.


또는 당신이 만들 수는 f()의 약간 다른 버전 fTail()라고 (또는 당신은 전화를 원하는) :

var some = g.f(arg1).f(arg2).fTail(arg3); 

fTail()는 다음과 같이 수 :

xxx.prototype.fTail = function() { 
    var retVal = this.f.apply(this, arguments); 

    // now do your tail operations here 

    return retVal; 
}; 

당신이 제안한대로, 나는 생각부터 배열의 배열 에서 귀하의 모든 문제를 해결하는 것, 사용하기 쉽고 잘 수행 할 것입니다 :

var some = g.f([arg1, arg2, arg3], fn); 
+0

감사합니다. 난 라이브 net - 유선 데이터 구조를 구현하려고 내 github을 볼 자유롭게 : hefeust/retiare 만약 당신이 그것에 대한 아이디어를 만들 것입니다 .. 나는 결정하려고합니다 : g.relation(). 대 g.relation ([역할], [처리자]) 어쩌면 두 번째 접근법 (체인화되지 않은, 완전하게하지 않음)은 롤 (role1) .role (role2) .on 배열로 지정)이 답변을 고려한 후에 이기게됩니다. 안부 –

+0

@HefeustCORTES - 단일 메서드 호출로 항목 배열을 수락하는 것은 N 코드화 된 함수 호출을 작성하는 것보다 코드 작성이 적고 실행 속도가 빠르며 물론 처리 한 시점을 알 수 있습니다. 배열의 마지막 것. 그렇다고해서 연쇄가 많은 경우에 유용하지는 않지만 (보통 그렇습니다), 일반적으로 같은 방법으로 반복해서 사용하는 것은 아닙니다. – jfriend00