0

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

当您编写 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 click 事件),您最终可能会使用错误的键变量值。

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

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 的对象,而是返回一个根本没有属性的对象(因此您无法获取属性的名称)。这使您无法在函数中检索最初查询的键。

我想这不是问题,因为它无论如何都有效。我只是不喜欢写这样的东西。还是我认为这是奇怪的代码是错误的?或者也许有一种方法可以更正确地做到这一点?

4

1 回答 1

2

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

var keys = ["cake", "pie", "squirrel"];
chrome.storage.sync.get(keys,function(result){
    keys.forEach(function(key){
        alert(result[key]);
    }) 
});
于 2013-10-06T07:02:43.787 回答