【问题标题】:Replace an older promise with a newer one in a jquery deferred chain在 jquery 延迟链中用较新的 Promise 替换旧的 Promise
【发布时间】:2013-02-01 12:27:49
【问题描述】:

我有一个对象,它使用 jQuery 的 Deferred 创建我自己的承诺,我会在超时后解决。然后我链接一个 ajax 调用,并返回承诺。

var Obj = function() {
  var _obj = new $.Deferred();

  setTimeout(function() {
      _obj.resolve("Resolve One!");
  }, 2000);

  return _obj.promise();
}

new Obj()
.done(function(message) {
  document.write(message);
  return $.get("http://www.jsonip.com/");
})
.done(function(response) {
  document.write(response);
})

我希望消息有“解决一个!”并响应来自 ajax 调用的响应

预期结果:

Resolve One!{"ip":"256.256.0.0","about":"/about"}

我得到的却是:

Resolve One!Resolve One!

由于我要返回$.get(),这是一个承诺,我希望旧的承诺会被来自 jQuery 的承诺覆盖。我应该怎么做才能让网页内容响应?

jsfiddle:http://jsfiddle.net/7zUKg/

【问题讨论】:

    标签: jquery jquery-deferred promise


    【解决方案1】:

    .done 只添加处理程序。你想要.then,它还允许你返回一个新的承诺:http://jsfiddle.net/7zUKg/1/

    new Obj()
    .then(function(message) {
      document.write(message);
      return $.get("http://www.jsonip.com/");
    })
    .done(function(response) {
      document.write(response);
    })
    

    【讨论】:

    • 我确定这个答案是正确的,但你也应该在(new Obj()) 周围加上括号,否则new 将尝试将自己应用于方法链右侧返回的任何内容. “成员”运算符. 的优先级高于new,因此整个方法链将首先执行。由于 Obj() 的性质,(a) 在这种情况下,缺少括号可能不是问题,并且 (b) new 可以省略。
    • @Beetroot-Beetroot:我不确定这是否正确。 new A.b() 需要括号,但 new A().b() 不需要。在这种情况下,new 具有更高的优先级。
    猜你喜欢
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多