当chrome.storage.sync.set
失败时,它会调用它的回调并设置chrome.runtime.lastError
,除非我访问该变量,否则
Unchecked runtime.lastError while running storage.set: QUOTA_BYTES_PER_ITEM quota exceeded
在控制台中。从我用Google搜索的预期来看,很酷。但是,我正在编写一个库,并且不希望用户为此烦恼,所以我将回调包含在另一个函数中。但我不知道如何检查chrome.runtime.lastError
是否已被检查,以便知道我是否想要压制我的处理。
我想要像
这样的东西chrome.storage.sync.set(key: "foo" * 1024 * 1024, function () {
user_callback();
if (!was_last_error_checked()) {
user_error_callback(chrome.runtime.lastError.message);
}
});
但是,我不知道如何实施was_last_error_checked
...
编辑:更清楚:有没有办法检查chrome.runtime.lastError
是否在user_callback
内被访问了所以我可以避免在假设user_error_callback
已经处理的情况下触发user_callback
错误?
答案 0 :(得分:0)
从评论来看,似乎有两种方法可以处理我的问题:
1)定义lastError
时,承诺失败:
def set(**data)
promise = Promise.new
%x{
#{@wrap}.set(data.$to_n(), function() {
if (chrome.runtime.lastError) {
promise.$reject(chrome.runtime.lastError.message)
} else {
promise.$resolve();
}
});
}
promise
end
2)使用Proxy
对象替换chrome.runtime
并检测对lastError
的访问权限:
%x{
var handler = {
get: function(obj, prop) {
window.last_error_accessed = true;
return obj[prop];
}
};
chrome.runtime = new Proxy(chrome.runtime, handler);
}
并在回调中:
def set(**data)
promise = Promise.new
%x{
#{@wrap}.set(data.$to_n(), function() {
window.last_error_accessed = false;
promise.$resolve();
if (!window.last_error_accessed && chrome.runtime.lastError) {
Opal.Kernel.$raise(chrome.runtime.lastError.message);
}
});
}
promise
end