我想将值传递给 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) {...}
),您可以执行以下操作:
- 使用一个参数调用该函数。它被分配给回调局部变量
data
。 - 第二个参数保持未定义状态。它被分配给回调局部变量
e
。 - 如果外部作用域中有变量
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/