函数回调,局部变量和chrome.storage.sync.get

时间:2013-10-05 20:27:38

标签: javascript jquery google-chrome-extension

这更像是一个美学问题,而不是一个实际问题。 Google建议的代码运行正常。但是,我觉得写作不太舒服。

撰写Google Chrome扩展程序时,您可以使用永久存储空间。它是使用某个函数检索的,如下所示:

chrome.storage.sync.get("cake", function(result) {
    alert(result["cake"]);
});

这没关系。现在,如果你想从存储中迭代很多值,它可以是这样的:

var keys = new Array("cake", "pie", "squirrel");
$.each(keys, function() {
    var key = $('<div>').append(this).html(); // ignore this line
    chrome.storage.sync.get(key, function(result) {
        alert(result[key]);
    });
});

这非常有效。除非我不能动摇您在技术上使用回调函数的想法,该回调函数使用由迭代更改的外部函数的局部变量。我将假设回调在完成迭代周期后不可能发生,但在其他情况下(例如,jQuery点击事件),您最终可能会使用错误的键变量值。

如果您可以随时从结果中检索密钥,那就没问题了。像这样:

var keys = new Array("cake", "pie", "squirrel");
$.each(keys, function() {
    var key = $('<div>').append(this).html(); // ignore this line

    chrome.storage.sync.get(key, function(result) {
        var key;
        for (key in result) {}

        alert(result[key]);
    });
});

但如果它在存储中找不到现有值,则不能。它不返回一个属性设置为null的对象,而是返回一个根本没有属性的对象(因此无法获取属性的名称)。这使您无法在函数中检索最初查询的密钥。

我认为这不是问题,因为它无论如何都有效。我只是不喜欢写这样的东西。或者我认为这是奇怪的代码我错了吗?或者也许有办法更恰当地做到这一点?

1 个答案:

答案 0 :(得分:2)

嗯,你有一个很奇怪的问题。 StorageArea.get接受键或键数组作为第一个参数。所以你可以像这样写代码:

var keys = ["cake", "pie", "squirrel"];
chrome.storage.sync.get(keys,function(result){
    keys.forEach(function(key){
        alert(result[key]);
    }) 
});