Javascript 使用Chrome API时未选中runtime.lastError
我在我的应用程序中使用Javascript 使用Chrome API时未选中runtime.lastError,javascript,google-chrome-extension,google-chrome-app,Javascript,Google Chrome Extension,Google Chrome App,我在我的应用程序中使用chrome.fileSystemAPI打开一个文件。单击文件选择器对话框的取消按钮时,出现错误: 运行文件系统时未选中runtime.lastError。选择entry:用户已取消 如何修复此错误?此错误在本例中并不重要,但我将解释它以及如何消除它 这个错误是什么? ChromeAPI大多是异步的:您有一个回调,在操作完成时调用 如果使用chrome.fileSystem.chooseSentry,所选条目将被传递到回调: chrome.fileSystem.choose
chrome.fileSystem
API打开一个文件。单击文件选择器对话框的取消
按钮时,出现错误:
运行文件系统时未选中runtime.lastError
。选择entry:用户已取消
如何修复此错误?此错误在本例中并不重要,但我将解释它以及如何消除它 这个错误是什么? ChromeAPI大多是异步的:您有一个回调,在操作完成时调用 如果使用chrome.fileSystem.chooseSentry,所选条目将被传递到回调:
chrome.fileSystem.chooseEntry(
{/* options */},
function(entry) {
// This is the callback for the API call; you can do something with entry
}
);
但是,API不能保证产生结果。例如,在您的情况下,用户可能会通过单击“取消”拒绝提供访问权限。那么就没有条目可供使用,您可能需要解释为什么会发生这种情况。如何在不使用额外的“error”参数污染所有回调的情况下引发错误
通常,Chrome会在调用回调时设置一个全局变量,Chrome.runtime.lastError
在Chrome异步API中使用此参数而不是错误参数是一致的。事实上,引用Chrome.fileSystem
文档:
通过chrome.runtime.lastError通知所有故障
- 如果一切正常,它将是未定义的
- 如果有问题,它将是非空的,
将解释问题所在chrome.runtime.lastError.message
Chrome.runtime.lastError
是否在回调中实际检查(评估)。如果不是,它将认为这是一个未处理的异常,并抛出此错误
我为什么说它不重要?
虽然这是一个错误,但它不会中断程序的执行(它在异步任务结束时抛出),也不会真正显示给用户
虽然我说这不重要,但您应该检查程序的逻辑。它可能没问题,也可能没问题——这是一个(严厉的)警告
它为什么存在?
为了警告您,开发人员,您的代码可能试图使用不存在的结果,因为出现了问题
您可能已经在检查错误,例如
if (entry) {
// Process entry
} else {
// Something went wrong (but what?)
}
Chrome不使用复杂的启发式方法来查看您的代码是否期望这种可能性。如前所述,错误是通过chrome.runtime.lastError报告的,您需要检查它
请注意,此错误仅在发生错误时才会出现,而不是在API调用正常完成时
我能赶上吗?
不是真的;它不是由您的代码引发的,而是在ChromeAPI中处理异步任务的清理代码;因此,使用尝试。。。回调中的catch
没有帮助。因为它是异步的,所以在原始API调用周围使用try
也不会有帮助
怎么处理它?
您应该向回调中添加逻辑,以按照Chrome的预期方式检查问题,并可能做出反应
function(entry) {
if(chrome.runtime.lastError) {
// Something went wrong
console.warn("Whoops.. " + chrome.runtime.lastError.message);
// Maybe explain that to the user too?
} else {
// No errors, you can use entry
}
}
只要Chrome看到您在出现错误时检查了该值(即,在回调中对其进行了评估),就不会抛出该错误。迟到,但以下是我在
Chrome.windows.remove()调用中抑制错误的方法,以防它对其他人有帮助。而不是
chrome.windows.remove(foo); // unconditional; runtime.lastError not checked
我曾经
chrome.windows.remove(
foo,
function ignore_error() { void chrome.runtime.lastError; }
);
计算其操作数,然后返回未定义的
。我认为这段代码相当有效地记录了它的目的是忽略错误:)
为简洁起见,ignore\u error()
可以从该调用中拉出,并用于多个chrome
API调用,或者可以省略名称ignore\u error
更新在ES6中,您可以使用较短的语法:
在Chrome 64中测试这种类型的错误try catch
没有帮助。相反,您可以访问全局变量chrome.runtime.lastError
,正如@xan在上面的精彩回复中提到的(顺便说一句,您应该阅读并投票!)
现在,我提供一个可以使用的示例:
function catchLastError(){
if(chrome.runtime.lastError){
console.log("error: ", chrome.runtime.lastError);
}else{
// some code goes here.
}
}
chrome.fileSystem.chooseEntry(yourEntry,catchLastError);
也许你应该试试。。。CATCH block.@Seti在这种情况下没有帮助。那么,也许你可以给我们你在chrome.filesystem中使用的代码?@Seti看到我的答案,为什么试试。。。catch
抓不到它。@Xan谢谢!您的回复非常有用~我想是的,但是如果他添加了他正在使用的代码,并且我们发现他的回调无法清除错误-我们可以更快地回答。谢谢您的回复,这非常有用@没问题。还澄清了这不是检查错误的唯一方法,而是跨ChromeAPI的统一方法。难以置信的答案!谢谢你花时间写这篇文章。我从来没有说过我认为这是一个好的架构,但它是什么——这是Chrome API早期的一个设计决定。我不是Chrome开发团队的成员,因此我无法告诉您选择此选项的原因。未捕获的TypeError:无法读取的属性“remove”undefined@Jordanchrome.windows
是扩展API的一部分。如果您试图在常规网页上使用此选项,chrome.windows
不存在,这会导致您看到的错误。
function catchLastError(){
if(chrome.runtime.lastError){
console.log("error: ", chrome.runtime.lastError);
}else{
// some code goes here.
}
}
chrome.fileSystem.chooseEntry(yourEntry,catchLastError);