我可以使用jQuery的Deferred.promise()来替换对象的现有承诺吗?

时间:2013-02-23 03:40:30

标签: jquery jquery-deferred

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

  

如果提供了target,deferred.promise()会将方法附加到   它然后返回此对象而不是创建一个新对象。这个可以   将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。)

我的理解是完全错误的,还是有某种方式以某种方式替换对象的整个promise接口?

1 个答案:

答案 0 :(得分:1)

您正在替换该getJSON调用的基于promise的接口,但是在您发起请求并且已经附加了“旧完成”回调之后,该替换正在进行。此外,原始的getJSON延迟仍然是在请求完成时解决的问题,这就是为什么它被解雇而你的问题没有解决。

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

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

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安全。此示例不处理其他已弃用的延迟处理程序(成功,错误,完成),但如果您愿意,则不难解决此问题。