【问题标题】:How do I convert this lazy assignment via ajax into a promise?如何通过 ajax 将这个惰性赋值转换为 Promise?
【发布时间】:2013-10-26 05:43:37
【问题描述】:

我查看了this question about cachingthis one about conditional promises,但说实话,我还是有点困惑,因为我以前从未使用过 Promise。

我正在使用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...?

非常感谢任何帮助。

【问题讨论】:

    标签: javascript jquery promise when-js


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我想多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2011-11-22
    • 2021-10-02
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多