2011-02-09 37 views
0

我已經創建了一個模擬我在實際頁面上遇到的問題的測試頁。jQuery 1.5:爲什麼Deferred對象在UNRESOLVED狀態下調用.done()?

正如您在doSomething2()中看到的那樣,dfd對象故意從未解決。但是,當我運行以下代碼時,doSomething()中的.done()始終會觸發。檢查控制檯,你會看到dfd.isResolved()false正好在.done()之前運行。

任何見解?任何幫助表示讚賞

<!DOCTYPE html> 
<html> 
<head> 
    <title>Testing Page</title> 
    <script src="jquery-git-02092011.js" type="text/javascript"></script> 
</head> 
<body> 
    <div id="test"> 
      <div ></div> 
      <div ></div> 
    </div> 

    <script> 
     function doSomething() { 
      $('#test div').each(function(){ 
       $(this).append($('<div></div>').load('http://www.google.com',function(){ 
        doSomething2().done(console.log('dosomething2 is complete')); 
       })) 
      }); 
     } 

     function doSomething2() { 
      var dfd = $.Deferred(); 
      console.log(dfd.isResolved()); 
      return dfd; 
     } 

     $(document).ready(function() { 
      doSomething(); 
     }); 
    </script> 
</body> 
</html> 

編輯: 據我所知,這個功能無所作爲。我剛剛舉了一個例子來重現我的問題。 我瞭解提取'google.com'是違反SOP。我剛剛創建了這個例子來複制我的問題。我正在開發一個Web應用程序,旨在從一個HTML文件本地運行。在這種情況下,SOP沒有嚴格遵守,所以這應該是至少可以測試。

編輯:我創建了一個的jsfiddle來測試此行爲:http://jsfiddle.net/Sgwpv/2/

回答

1

你的問題是這樣的傳球在一份聲明中對.done而不是一個函數

看直播example

在內部,.done需要函數列表並將它們推送到回調數組,因此

callbacks.push(elem);

你傳遞一個語句elem並獲得

callbacks.push(alert("foo"));

你推聲明的返回值(在這種情況下undefined)回調陣列而不是一個函數。

+0

明白了!非常感謝您的幫助 – ampersand 2011-02-09 17:22:02

相關問題