2012-09-06 3 views
2

나는 지연 스크립트를 구현하는 작은 스크립트로 작업 중이며 Javascript를 기대하는 것처럼 동작하지 않는 코드를 실행합니다.jQuery deferred weirdness

var dfd = $.Deferred() 
    , view = $.get("filename.tmpl"); 

$.get("filename.json") 
    .always(function (model) { 
    dfd.resolve(model); 
    }); 

$.when(view, dfd) 
    .done(function (view, model) { 
    // do stuff with view - even if there is no model 
    }); 

그리고 이것은 잘 작동하지만이에 리팩토링 할 때 작동이 중지 :이 작동하지 않을 것이 어떤 이유가 표시되지 않습니다

var dfd = $.Deferred() 
    , view = $.get("filename.tmpl"); 

$.get("filename.json").always(dfd.resolve); 

$.when(view, dfd) 
    .done(function (view, model) { 
    // do stuff with view - even if there is no model 
    }); 

합니다. 이 함수는 첫 번째 인수가 모델이거나 정의되지 않았 으면합니다.

답변

2

이 수행 할 때 대신의

$.get("filename.json").always(dfd.resolve); 

:

$.get("filename.json") 
    .always(function (model) { 
    dfd.resolve(model); 
}); 

을 당신이 resolve() 방법에 대한 this 포인터로 전달 다른 개체를 얻을 것이다. 두 번째는 dfd의 컨텍스트에서 호출합니다. 첫 번째는 $.get()에서 반환 된 지연된 객체의 컨텍스트라고합니다.

콜백을 전달할 때 dfd.resolve은 메소드에 대한 포인터를 가져옵니다. resolve이 호출 될 컨텍스트를 설정하지 않습니다. 이는 내부적으로 .always() 메소드로 설정됩니다.

+0

그렇다면'model'을'dfd.resolve'의 문맥으로 묶는다면 여전히 작동하지 않아야합니까? 이렇게 :'model.always (dfd.resolve.bind (model));'. – kalisjoshua

+1

두 번째 코드 스 니펫에서 첫 번째 스 니핏과 동일한 결과를 얻으려면'model'이 아니라'dfd'를 찾아야합니다 :'$ .get ("filename.json"). always (dfd .resolve.bind (dfd));'그러나 이것이 왜 발생했는지를 명확히하는 첫 번째 코드 스 니펫보다 왜 더 좋은지 모르겠습니다. – jfriend00

+0

동의 함. 나는 그런 식으로해야한다는 철학적 인 제안을하지 않았습니다. 도움을 주셔서 감사합니다. 나는 오늘 저녁이 너무 게으르다가 왜 그렇게 일하는 것인지 깊이 생각하지 못했습니다. – kalisjoshua