2014-12-29 7 views
0

지연 기능을 내 밑줄 체인의 일부로 실행하고 싶습니다. 지연 함수는 래퍼 객체가 아닌 명시 적 인수가 전달 된 경우에만 작동하는 것처럼 보입니다.지연 기능 체인 연결

var message = function (text) { 
       var txt = text; 
       var show = function() { alert(txt); }; 
       return { 
        Text: txt, 
        Show: show 
       }; 
      }; 

_.chain(new message("hello")).delay(function(m) { m.Show(); }, 1000); 

이 코드는 작동 :

var x = _.chain(new message("hello")).value(); 
      _.delay(function (m) { m.Show(); }, 1000, x); 

더 이상 기능적 표현의 내부 지연 작품을 만들 수있는 방법이 있나요 작동하지 않습니다이 코드 (정의되지 않은 함수 예외가 아니다)?

예. 뷰 모델 인스턴스 생성을 연기 한 다음 UI에 대한 바인딩을 X ms 지연하려고합니다.

+0

당신이하려는 것은 체인의 의도 된 목적처럼 보이지 않습니다. 어쩌면 당신은 약속을 살펴 봐야 할 것입니다. 예를 들어 https://github.com/kriskowal/q 또는 jQuery에 내장 된 것을 사용해 볼 수 있습니다. –

답변

0

그 기능에 대한 첫 번째 인수로를 통과하는 모든 다음과 같은 기능을 통해 단지 파이프 인수를,이다 : 그런 일을보십시오. delay()에 첫 번째 인수는 기능을 달성하기 위해 다음 기능을해야하기 때문에

당신은 당신이 이런 식으로 뭔가를해야 할 것 욕망 :

_.chain(function(m) { 
     m.Show(); 
    }).delay(1000, new message("hello")); 

하지만 난 당신이 원하는 구조가없는 것 같아요.

그래서 직접 delay()를 사용할 수 없지만 tap()를 통해 사용할 수 있습니다 더 간결 tap()bind()의 사용과

_.chain(new message("hello")) 
    .tap(function(m) { 
     _.delay(function() { 
      m.Show(); 
     }, 1000); 
    }) 

또는 :

_.chain(new message("hello")) 
    .tap(_.delay.bind(null, function(m) { 
      m.Show(); 
    }, 1000)) 

당신이 완 경우 ' 컬렉션에서 컬렉션을으로 전달하고 컬렉션의 모든 요소에 대해 delay()을 수행하려면 tap() 대신 each()을 사용하십시오.

: 그것은 underscore.js보다는 github.com/kriskowal/q 약속을 사용하지만 그게 내가 당신이하려는 생각 무엇으로 다음


, 즉 작업의 파이프 라인 비동기 그들 중 일부를 통해 뭔가를 밀어 대답하지 않습니다

var message = function (text) { 
       var txt = text; 
       var show = function() { alert(txt); }; 
       return { 
        Text: txt, 
        Show: show 
       }; 
      }; 


function delay(time) { 
    return function(m) { 
     var next = Q.defer(); 
     setTimeout(function() { 
      next.resolve(m); 
     }, 1000); 
     return next.promise; 
    } 
} 

Q.when(new message("hello")) 
    .then(delay(1000)) 
    .then(function(m) { 
     m.Show(); 
    }); 
+0

맞습니다. 그것은 오히려 약속의 흐름입니다.나는 Q/when과 같은 다른 라이브러리를 도입하는 것을 저축하기 위해 노력하고 있었기 때문에, 탭 + 바인드 솔루션을 사용하거나 재사용 할 수있는 확장 기능을 제공 할 것입니다. 예 : _.lazy 및 _.delayedBind 래퍼 –

0

_.delay의 첫 번째 인수는 함수 여야하지만 메시지 클래스 (객체) 인 경우 인스턴스를 전달합니다. f.e.

var foo = function(){ 
    console.log('FOO'); 
} 
_.chain(foo).delay(200); 

케이스에 체인을 사용하면 오버 헤드가 발생합니다. chain()은 밑줄에 무엇을

var showMsg = function(){ 
    var msg = new message("hello"); 
    msg.Show(); 
}; 

_(showMsg).delay(200); 
+0

메시지 클래스의 인스턴스를 전달하면 작동합니다 (두 번째 버전). _ 래퍼 객체에서는 작동하지 않습니다. 예를 들어이 사례를 게시했습니다. 예를 들어 나는보기 모델을 구축하고, 데이터를 미리로드하고,보기에 바인딩하고, 볼 수있는 그룹간에 전환하는보다 복잡한 시나리오를 가지고 있습니다. –