如何检查chrome.runtime.lastError是否已被选中?

时间:2018-03-17 17:38:16

标签: javascript google-chrome-extension

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错误?

1 个答案:

答案 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