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