2013-02-23 61 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

相關問題