2012-09-10 36 views
2

我正在使用chrome.downloads.download API的鉻擴展。我的擴展是捕獲下載事件並觸發webkitNotification。我從Google的樣本中發佈了我修改的主要工作功能。爲什麼chrome.downloads.download無法在沒有添加其他功能後工作(它工作時添加alert()後)

function downloadCheckedLinks() { 
    for (var i = 0; i < visibleLinks.length; ++i) { 
     if (document.getElementById('check' + i).checked) {   
      chrome.downloads.download({url: visibleLinks[i]}, function(id) { 
       var notification = window.webkitNotifications.createNotification('', 
           'OMG', 'hello within for loop, succeed!'); 
       notification.show(); 
      }); 
      alert("function executed!"); 
     } 
    } 
    window.close(); 
} 

問題是,當我刪除alert("function executed"),它僅在調試模式,其中我設置斷點在for循環和通過代碼工作。在正常模式下,我必須添加一些東西才能使其工作(即alert())。我覺得這是因爲chrome.downloads.download()的異步函數調用。

由於我是網絡開發新手,我不完全知道我的問題在哪裏。有人能幫我弄清楚這裏發生了什麼嗎?如果可能的話,你能否教我一個像這樣的異步函數調用chrome.downloads.download(),當匿名回調函數被完全調用?

回答

1

評論window.close()可以工作。我猜想當窗口關閉時,下載電話被取消。但我不能給出確切的原因。

0

您的JavaScript代碼在文檔的上下文中執行。如果你發出一個window.close你的JavaScript函數被停止,它的代碼和數據垃圾收集。 由於回調函數,chrome.downloads.download可能是異步的。 Javascript引擎是單線程的。由於這個原因,只要你的for循環執行沒有其他的JavaScript正在運行。對chrome.downloads.download的調用將排隊到某個內部的JavaScript引擎隊列:在當前函數結束後立即執行。 您發出的最後一條語句是window.close();

JavaScript隊列仍然保留一些要執行的函數,但window.close()獲勝:隊列被終止,您的回調永遠不會被觸發。

它可以在你使用調試器的時候工作:調試器保持你的窗口被引用,因此在內存中,這使得javascript引擎執行排隊的功能。

如果您添加幾行代碼,你可以關閉,如果所有的下載已經結束的窗口:

function downloadCheckedLinks() { 
    var pending = 0; // closure var 
    for (var i = 0; i < visibleLinks.length; ++i) { 
     if (document.getElementById('check' + i).checked) { 
      pending = pending + 1;  
      chrome.downloads.download({url: visibleLinks[i]}, function(id) { 
       var notification = window.webkitNotifications.createNotification('', 
           'OMG', 'hello within for loop, succeed!'); 
       notification.show(); 
       pending = pending - 1; 
       if (pending <1) { 
        window.close(); 
       } 
      }); 
     } 
    } 
} 
相關問題