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