downloads.onChanged的事件处理程序出错:TypeError:无法读取未定义的属性“current”

时间:2017-03-20 00:52:04

标签: javascript google-chrome-extension

我是Chrome扩展程序的新手,我正在开发一个简单的扩展程序,用于打开上次下载文件的文件夹。如果文件已删除,则会打开下载文件夹。 每当我运行我的代码时,此错误都会登录到我的控制台。 有关如何改进我的代码的任何帮助表示赞赏。

的manifest.json

{
	"name" : "Last Download",
	"version" : "1.0",
	"manifest_version" : 2,
	"description" : "Opens the last downloaded file",
	"background" : {
		"scripts" : ["background.js"]
	},
	"icons" : {
		"64" : "icon.png"
	},
	"browser_action" : {
		"default_icon" : "icon.png",
		"default_title" : "Last Download"
	},
	"permissions" : [
		"background",
		"downloads",
		"downloads.shelf",
		"storage"
	]
}

background.js

var State=false;
chrome.downloads.onChanged.addListener(function(delta) {
	chrome.downloads.setShelfEnabled(false);
	if (delta.state.current == 'in_progress'){
		State=true;
	}
	else if (delta.state.current == 'complete'){
		State=false;
		chrome.storage.local.clear;
		chrome.storage.local.set({'lastDownloaded' : delta});
		chrome.downloads.show(delta.id);
	}
	chrome.downloads.setShelfEnabled(true);
});
function click(){
	if (State==false){
	chrome.storage.local.get('lastDownloaded' , function(result){
		chrome.downloads.search({id : result.lastDownloaded.id}, function(file){
			if (file[0].exists == false) {
				chrome.storage.local.clear;
				chrome.downloads.showDefaultFolder();
			}
			else if (file[0].exists == true){
				chrome.downloads.show(result.lastDownloaded.id);
			}
		});
		
	});
	}
	if (State==true){
		chrome.tabs.create({url: "chrome://downloads/"});
	}
}
chrome.browserAction.onClicked.addListener(click);

1 个答案:

答案 0 :(得分:0)

statedownloadDelta对象的可选属性。当您收到错误时,该属性不存在。这是未定义的。因此,当您尝试使用delta.state.current时,您试图获取未定义属性的current属性,这会生成您看到的错误。

您需要查看delta对象上可用的属性,以查看缺少state属性的属性,为您提供执行任何操作所需的信息当你处于那种情况时,你希望这样做。下载/用户交互。您可以通过使用调试器或使用console.log(delta)为您提供该信息的常规调试方法来执行此操作。然后,将存在的属性及其值与要处理的状态相关联,并测试属性是否为这些值。

如果您只想避免错误,则应检查是否存在state属性。如果需要,您可以测试delta.state评估为true。但是,鉴于您正在获取它的属性,最好检查它是否为对象而不是null

if(typeof delta.state === 'object' && delta.state !== null) {
    if (delta.state.current == 'in_progress'){
        State=true;
    } else if (delta.state.current == 'complete'){
        State=false;
        chrome.storage.local.clear;
        chrome.storage.local.set({'lastDownloaded' : delta});
        chrome.downloads.show(delta.id);
    }
} else {
    //This is the condition under which you are getting your error. you need to determine
    //  what you want to do here, if anything.
    console.log('downloads.onChanged: In a state not specifically handled. delta=',delta);
}