我看了this question about caching和this one about conditional promises但说实话,我仍然有点困惑,因为我以前从未使用过承诺。
我正在使用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
调用它...?
非常感谢任何帮助。
答案 0 :(得分:1)
您正在触发对同一文件的多个请求,因为if测试在请求完成之前给出错误。你应该马上 分配它所以只有一个文件请求
成功的ajax的分辨率值应该是对responseText的有意义的反映,所以你可以这样做:
class Loader
@files: {}
@load: (path) ->
if not @files[path]
@files[path] = $.ajax(url: path)
@files[path]