2013-10-25 3 views
1

나는 this question about cachingthis one about conditional promises을 보았지만 솔직히 말해서 나는 결코 전에 약속을 사용하지 않았기 때문에 약간 혼란 스럽다.Ajax를 통해이 지연 할당을 약속으로 변환하려면 어떻게해야합니까?

나는 when.js v2.5.1과 jQuery v2.0.3을 사용하고 있습니다.

: 나는

class Loader 
    @files: {} 
    @load: (path) -> 
    @files[path] ?= $.ajax(url: path).responseText 

는 다음과 같이 호출 할 (내가 그 고수하지만, 자바 스크립트로 응답 해 주시기 것이다 그래서 너무 명확 커피 스크립트에서의) 약속에 다음 코드를 변환하려고 해요

mytext = Loader.load "/path/to/greatness" 

그래서 저는 약속을 되돌리고 싶습니다. jQuery의 xhr은 연기가 가능하고 Promise API SoleWimplements를 사용하므로이 기능을 사용할 수 있습니까?

class Loader 
    @files: {} 
    @load: (path) -> 
    if @files[path] 
     deferred = When.defer() 
     deferred.resolve @files[path] 
     deferred.promise 
    else 
     $.ajax(url: path).done (data)=> 
     @files[path] = xhr.responseText 

무엇이 반환 되든간에 then이 호출 될 수 있기 때문에 ... ...?

도움을 주시면 감사하겠습니다.

답변

1

요청이 완료 될 때까지 if 테스트가 false를 제공하기 때문에 같은 파일에 대해 여러 요청을 실행하고 있습니다. 즉시 그것을 지금까지 성공적인 아약스의 해상도 값 어쨌든에서 responseText의 의미 반사 방금이 할 수 있어야하므로

하게되어있는 파일 때문에 하나 개의 요청 만 지정해야합니다 :

class Loader 
    @files: {} 
    @load: (path) -> 
    if not @files[path] 
     @files[path] = $.ajax(url: path) 
    @files[path] 
+0

감사합니다, I 그것을 overthinking했다. – iain