2012-04-20 3 views
15

나는 특정 작업을 수행 할 수있는 방법을 찾고 있어요 그것은.bind 사용 .apply .call()와()를 피하기()

when(promiseArray).done(...) 

jQuery.when.apply(null, promiseArray).done(...) 

에서 것입니다

아시다시피, .bind()을 사용하면 기본 인수와 같은 것을 만들 수 있고 꽤 멋진 일을 할 수 있습니다. 예, 대신 항상

var toStr = Object.prototype.toString; 
// ... 
toStr.call([]) // [object Array] 

를 호출하기 위해 우리는이 같은 .bind()를 호출 성능 위약금이있는 경우에도 (매우 멋진

var toStr = Function.prototype.call.bind(Object.prototype.toString); 
toStr([]) // [object Array] 

처럼 할 수있다, 나는 그것을 알고 난 그것을 알고),하지만 난 정말 jQuerys .when 전화를 위해 그것을 수행 할 수 없습니다. 알려지지 않은 양의 약속 객체가있는 경우 대개 배열을 배열로 밀어 넣어 위에있는 첫 번째 코드 조각과 같이 .when에 전달할 수있게합니다.

var when = Function.prototype.apply.bind($.when); 

이제 우리는

when(null, promiseArray).done(...) 

이 작동 같이 갈 수 있지만, 나는 또한 null에 명시 적으로 모든 통과의 필요성을 제거 할 :

나는 지금까지하고 있어요 시각. 그래서

var when = Function.prototype.apply.bind($.when.call.bind(null)); 

을 시도하지만 나를 던졌습니다 :

"TypeError: Function.prototype.apply called on incompatible null" 

내가 지금 너무 오랫동안이 위에 앉아 것 같아 더 이상 똑바로 생각할 수 없다. 쉬운 해결책이있는 것처럼 느껴집니다. 이 문제를 해결하기 위해 추가 기능을 사용하고 싶지 않습니다. .bind()을 사용하는 솔루션을 선호합니다. http://jsfiddle.net/pp26L/

+1

'.bind':

var when = Function.prototype.apply.bind($.when , null); 

그리고 업데이트 jsfiddle을? – Raynos

+0

@ 레이 노스 : 예, 내 상처 입은 자아에 소금을 문지르세요.: p – jAndy

답변

10

이 작동합니다 : (당신이 선호하는 경우, 또는 카레)

when = Function.prototype.apply.bind($.when, null); 

당신은 단지 결합 .bind의 첫 번째 인수와 null에 고정

여기 완전한 예제를 참조하십시오.

Fiddle.

+0

omg, 나는 언젠가는 그렇게했다고 확신한다. 나는 그것을 어떻게 놓칠 수 있습니까? 적어도 나는 그것이 큰 문제에 대해 상당히 쉬운 해결책이라는 것을 알았다. @ 존 감사합니다! – jAndy

+0

@jAndy : JS 절단이 내 것보다 훨씬 낫다는 것을 고려하면, 피로 때문에 놓친 것이 분명합니다. 건배. – Jon

7

bind은 가변 개수의 인수를 허용하므로 부분적으로 메소드를 적용 할 수 있습니다. 그래서, 대신 :

var when = Function.prototype.apply.bind($.when); 

이 작업을 수행 : (널 (null) $ .when) http://jsfiddle.net/pp26L/2/