如何通过ajax将这个惰性赋值转换为promise?

时间:2013-10-25 12:14:30

标签: javascript jquery promise when-js

我看了this question about cachingthis 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调用它...?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您正在触发对同一文件的多个请求,因为if测试在请求完成之前给出错误。你应该马上 分配它所以只有一个文件请求

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

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