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

时间:2016-06-23 11:06:04

标签: 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显示为未定义。

2 个答案:

答案 0 :(得分:2)

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

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

  1. 使用一个参数调用该函数。它被分配给回调局部变量data
  2. 第二个参数未定义。它被分配给回调局部变量e
  3. 如果外部作用域中存在变量e,则无法再访问它。
  4. 我认为第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 problemanother 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使用异步代码。