我想将值传递给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显示为未定义。
答案 0 :(得分:2)
.get()
expects exactly 1 parameter的回调。
通过传递带有2个参数(即function(data, e) {...}
)的函数,您可以执行以下操作:
data
。e
。e
,则无法再访问它。我认为第3部分正好是你的问题。您在您调用e
的范围内有一个变量.get()
,但您无法访问它。
通常,由于名为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
变量?虽然您可以在decrypted
的回调中使用.get()
,但由于它是异步的,因此您无法在外部使用它。有一个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。
答案 1 :(得分:1)
因此,从下面的评论中,我想您希望将值传递给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
使用异步代码。