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