javascript - 我如何将变量传递给 chrome.storage.sync.get()

标签 javascript google-chrome-extension

我想将值传递给 chrome.storage.sync.get() 函数。

chrome.storage.sync.get('privateKey', function(data, e) {
  if (data.privateKey) {
    var decrypt = new JSEncrypt();
    decrypt.setPrivateKey(data.privateKey);
    var uncrypted = decrypt.decrypt(e.detail.encryptedVal)
    alert(uncrypted);
  } else {
    alert("key is not set");
  }
 });

但是 e.detail.encryptedVal 显示为未定义。

最佳答案

.get()的回调 expects exactly 1 parameter .

通过传递一个带有 2 个参数的函数(即 function(data, e) {...}),您可以执行以下操作:

  1. 使用一个参数调用该函数。它被分配给回调局部变量data
  2. 第二个参数保持未定义状态。它被分配给回调局部变量e
  3. 如果外部作用域中有变量e,则无法再访问它。

我认为第 3 部分正是您的问题。您在调用 .get() 的范围内一个变量 e,但您使其无法访问。

一般来说,由于名为 closures 的概念,您实际上不需要在作用域内传递e - 您只需使用外部作用域中的变量,并且它将保留在内存中直到函数执行。如果有任何意义的话,可以将其视为“局部全局”变量。如果没有的话,有better explanations .

考虑到这一点:

chrome.storage.sync.get('privateKey', function(data) { // just don't mention e here
  /* ... */
    // Just use e inside if it comes from outer scope
    var uncrypted = decrypt.decrypt(e.detail.encryptedVal);
  /* ... */
});

更好的是,让我们将其变成一个函数:

function decryptValue(value, callback) {
  chrome.storage.sync.get('privateKey', function(data) {
    var decrypt = new JSEncrypt();
    decrypt.setPrivateKey(data.privateKey);
    var decrypted = decrypt.decrypt(value);
    callback(decrypted);
  }
}

/* ... */
decryptValue(e.detail.encryptedVal, function(decrypted) {
  // Do something
});
/* ... */

注意到callback变量了吗?虽然您可以在 .get() 的回调内部使用 decrypted,但由于它是异步的,您无法在外部使用它。有一个very good overview of the problem ,和another one here 。基本上,.get() 是异步的,因此您必须使用回调。

/* ... */
decryptValue(e.detail.encryptedVal, function(decrypted) {
  // Do something with decrypted
});
// Here, decrypted is not yet computed
/* ... */

大多数 Chrome API 都是异步的。我建议阅读You Don't Know JS book就主题而言。

关于javascript - 我如何将变量传递给 chrome.storage.sync.get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37989831/

相关文章:

javascript - 使用 grunt 任务将代码注入(inject) AngularJS 文件

javascript - 在 Chrome 中启用音频的自动播放策略标志

javascript - Chrome 扩展 : Background Script Catch Network and HTTP Errors

google-chrome - 在开发过程中,如何判断 Chrome 扩展程序是由真实用户安装还是由我安装?

javascript - 调整大小时,jQuery 滑动切换动画使其他元素跳动

javascript - Firefox 4 和特殊字符的 Keycode

javascript - 禁用弹出窗口并调用 browserAction.onClicked

javascript - 如何在chrome扩展的内容脚本中取消绑定(bind)事件?

javascript - 将日期字符串从破折号转换为正斜杠

javascript - 如何在 IE、FF、Chrome 等上可靠地设置类 attr w/JavaScript?