1

我看了这个关于缓存的问题和这个关于条件承诺的问题,但老实说,我仍然有点困惑,因为我以前从未使用过承诺。

我正在使用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调用它……?

任何帮助深表感谢。

4

1 回答 1

1

您正在对同一个文件发出多个请求,因为 if 测试在请求完成之前给出 false 。您应该立即分配它,以便只发出一个文件请求

成功的 ajax 的分辨率值应该是 responseText 的有意义的反映,所以你可以这样做:

class Loader
  @files: {}
  @load: (path) ->
    if not @files[path]
      @files[path] = $.ajax(url: path)
    @files[path]
于 2013-10-25T21:43:37.577 回答