1

根据 jQuery 文档deferred.promise([target])

如果提供了 target, deferred.promise() 会将方法附加到它上面,然后返回这个对象而不是创建一个新对象。这对于将 Promise 行为附加到已经存在的对象很有用。

据我了解,调用promise()目标应该替换目标现有的承诺接口,在这种情况下,我希望记录以下内容"new done"

var defer = $.Deferred();

defer.done(function() { 
    console.log('new done')
});

defer.promise( 
    $.getJSON('/foo').done(function() { 
        console.log('old done')
    })
);

但我仍然得到目标的原始done回调。(使用 jQuery 1.8.3。)

我的理解完全不正确,还是有某种方法可以以某种方式替换对象的整个承诺接口?

4

1 回答 1

1

您正在替换该 getJSON 调用的基于 Promise 的接口,但是在您发起请求并已经附加了“旧完成”回调之后,就会发生替换。此外,原始的 getJSON deferred 仍然是请求完成时解决的问题,这就是为什么它会触发而你的不会触发的原因。

要完成您正在尝试的操作,您必须在附加任何回调之前替换接口。您还必须在请求完成时手动解决您提供的延迟。

通常,这样的事情会起作用:

var deferred = $.Deferred();
var request = $.getJSON( "url" );

request.then(
  function() {
    deferred.resolveWith( this, arguments );
  },

  function() {
    deferred.rejectWith( this, arguments );
  }
);

// Now it's safe to replace the promise methods on the request
deferred.promise( request );

// This callback is being attached to the Deferred we provided,
// not the one managed internally by getJSON
request.done(function() {
    console.log( "Done!" );
});

此方法仅对 .done、.fail 和 .always 是安全的。此示例未处理其他已弃用的延迟处理程序(success、error、complete),尽管如果您愿意,修复它并不难。

于 2013-02-23T07:14:19.833 回答