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



我想将值传递给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.cencryptedval显示我不确定。

.get()的回调期望正好1个参数。

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

  1. 该函数用一个参数调用。它被分配给回调 - 局部变量data
  2. 第二个参数保持不确定。它被分配给回调 - 局部变量e
  3. 如果外部范围中有可变的e,则不再可访问。

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

通常,由于称为关闭的概念,您实际上不需要在范围内传递 e-您只需使用来自外部范围的变量,它将保留在内存中,直到函数执行为止。如果有任何意义,将其视为"本地全局"变量。如果没有,有更好的解释。

考虑到这一点:

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,但由于它是异步的,因此您无法在外面使用它。这个问题有一个很好的概述,还有另一个。基本上,.get()是异步的,因此您必须使用回调。

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

大多数Chrome API都是异步的。我建议您阅读您不知道该主题的JS书。

因此,从注释bellow中,我想您想将值传递给get回调,以便在回调中用户。不幸的是,这不能按照您希望完成的方式完成。但是,您可以做的是编写decrypt功能,该功能将encryptedVal作为参数,然后只需使用它

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

请注意,此功能使用异步代码,并且您不得按照您的期望从中使用return

最新更新