Google chrome extension 为什么chrome.downloads.download不';如果不在其后添加另一个函数,则无法工作。(在其后添加alert()时,该函数起作用)

Google chrome extension 为什么chrome.downloads.download不';如果不在其后添加另一个函数,则无法工作。(在其后添加alert()时,该函数起作用),google-chrome-extension,Google Chrome Extension,我正在使用chrome.downloads.downloadAPI开发一个chrome扩展。我的扩展是捕获下载事件并触发webkitNotification。我从谷歌的一个示例发布了我的修改的主要工作功能 function downloadCheckedLinks() { for (var i = 0; i < visibleLinks.length; ++i) { if (document.getElementById('check' + i).checked)

我正在使用
chrome.downloads.download
API开发一个chrome扩展。我的扩展是捕获下载事件并触发
webkitNotification
。我从谷歌的一个示例发布了我的修改的主要工作功能

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();
}
函数下载checkedlinks(){
对于(变量i=0;i
问题是,当我删除
警报(“函数已执行”)
时,它只在调试模式下工作,在调试模式下,我在for循环中设置了一个断点并逐步执行代码。在正常模式下,我必须添加一些东西使其工作(即
alert()
)。我觉得这是因为chrome.downloads.download()的异步函数调用


因为我对网络开发这个词还不熟悉,所以我不知道我的问题出在哪里。有人能帮我弄清楚这里发生了什么吗?如果可能的话,您能告诉我在像这样的异步函数调用中,当匿名回调函数被准确调用时,chrome.downloads.download(),Comment
window.close()可以工作。我猜当窗口关闭时,下载呼叫被取消。但是我不能给出确切的原因。

您的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();
                }
            });
        }
    }
}
函数下载checkedlinks(){
var pending=0;//闭包变量
对于(变量i=0;i