2013-02-23 63 views
1

据jQuery的文档为deferred.promise([target])我可以使用jQuery的Deferred.promise()来替换对象的现有承诺吗?

如果提供的目标,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)

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

回答

1

您正在替换该getJSON调用的基于承诺的接口,但是在您发起请求并且已经附加了您的“完成时间”回调后发生了替换。此外,延迟原始的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和。总是安全的。其他不推荐使用的延迟处理程序(成功,错误,完整)不在本示例中处理,尽管如果您想要修复该问题并不难。

+0

谢谢,这绝对有助于澄清事情。我有一个[后续问题](http://stackoverflow.com/questions/15096350/can-i-manually-resolve-a-deferred-object-if-a-callback-might-need-to-reject-it)带着额外的扭曲... – 2013-02-26 18:19:21

相关问题