2013-10-25 36 views
1

我看了this question about cachingthis one about conditional promises但说实话,我还是有点困惑,因为我以前从未使用承诺。如何通过ajax将此懒惰转换为承诺?

我使用的是when.js v2.5.1和jQuery v2.0.3。我想下面的代码转换成一个承诺(它在CoffeeScript中如此清楚得多,所以我会与坚持,但随时与JavaScript的回应)

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

被称为像这样:

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

所以,我知道我想回报一个承诺。我知道jQuery的xhr是可延期的并实现了Promise API Something,所以我可以这样做吗?

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。您应该立即 指定它是有史以来

全成AJAX的分辨率值应反正这个responseText的有意义的反射,所以你可以做这样一个文件,以便只有一个请求:

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

谢谢,我正在推翻它。 – iain