使用存储在 Chrome 存储中的 key/values 创建 table
Creating a table using key/values stored in Chrome storage
我正在尝试使用 Chrome.sync.storage 中的 JSON 创建一个 table。这是我存储的东西-
"06-02-2018" : {"end" : "22:04", "start" : "22:04", "tasks" : "hello world"}
"18-02-2018" : {"end" : "1:05", "start" : "2:04", "tasks" : "hello world"}
"22-03-2018" : {"end" : "11:03", "start" : "15:04", "tasks" : "hello world"}
这是我想要实现的目标-
var storage = chrome.storage.sync;
function generateTable() {
var table = document.createElement('table');
storage.get(null, function (items) {
var allKeys = Object.keys(items);
// For every date in table,
for (var i = 0; i < allKeys.length; ++i) {
var currentKey = allKeys[i];
var tr = document.createElement('tr');
storage.get([currentKey], function(result){
// For every set of keys for a date,
$.each(result, function(date,details){
var td = document.createElement('td');
td.appendChild(document.createTextNode(date));
tr.appendChild(td);
$.each(details, function(key,value){
var tdTemp = document.createElement('td');
tdTemp.appendChild(document.createTextNode(value));
tr.appendChild(tdTemp);
});
table.appendChild(tr);
console.log(tr);
});
});
}
});
console.log(table);
document.body.appendChild(table);
}
问题是- table 不是每个日期只有一行,每行有 4 个单元格,而是只有一行有 12 个单元格。看起来可能是由于 chrome 存储的异步行为。有什么建议么?
你是对的,由于 chrome 存储的异步性质,它失败了。
本质上发生的是,您将 3 个空 table 行附加到 table,但是当第一个回调返回时,它认为第三行是要附加到的行,并且其他两个回调也是如此。
也不需要使用 $.each()
,因为你处理的是一个简单的对象文字。
var storage = chrome.storage.sync;
function generateTable() {
var table = document.createElement('table');
storage.get(null, function (items) {
for (currentKey of Object.keys(items)) {
var dateElement = items[currentKey];
var tableRow = document.createElement('tr');
tableRow.appendChild(createTableData(currentKey));
for(elementValue of Object.values(dateElement)){
tableRow.appendChild(createTableData(elementValue));
}
table.appendChild(tableRow);
}
document.body.appendChild(table);
});
}
function createTableData(value){
var tableData = document.createElement('td');
tableData.appendChild(document.createTextNode(value));
return tableData;
}
现在一切都在第一次回调中完成,所以在第一次存储之后一切都是同步的returns
我正在尝试使用 Chrome.sync.storage 中的 JSON 创建一个 table。这是我存储的东西-
"06-02-2018" : {"end" : "22:04", "start" : "22:04", "tasks" : "hello world"}
"18-02-2018" : {"end" : "1:05", "start" : "2:04", "tasks" : "hello world"}
"22-03-2018" : {"end" : "11:03", "start" : "15:04", "tasks" : "hello world"}
这是我想要实现的目标-
var storage = chrome.storage.sync;
function generateTable() {
var table = document.createElement('table');
storage.get(null, function (items) {
var allKeys = Object.keys(items);
// For every date in table,
for (var i = 0; i < allKeys.length; ++i) {
var currentKey = allKeys[i];
var tr = document.createElement('tr');
storage.get([currentKey], function(result){
// For every set of keys for a date,
$.each(result, function(date,details){
var td = document.createElement('td');
td.appendChild(document.createTextNode(date));
tr.appendChild(td);
$.each(details, function(key,value){
var tdTemp = document.createElement('td');
tdTemp.appendChild(document.createTextNode(value));
tr.appendChild(tdTemp);
});
table.appendChild(tr);
console.log(tr);
});
});
}
});
console.log(table);
document.body.appendChild(table);
}
问题是- table 不是每个日期只有一行,每行有 4 个单元格,而是只有一行有 12 个单元格。看起来可能是由于 chrome 存储的异步行为。有什么建议么?
你是对的,由于 chrome 存储的异步性质,它失败了。
本质上发生的是,您将 3 个空 table 行附加到 table,但是当第一个回调返回时,它认为第三行是要附加到的行,并且其他两个回调也是如此。
也不需要使用 $.each()
,因为你处理的是一个简单的对象文字。
var storage = chrome.storage.sync;
function generateTable() {
var table = document.createElement('table');
storage.get(null, function (items) {
for (currentKey of Object.keys(items)) {
var dateElement = items[currentKey];
var tableRow = document.createElement('tr');
tableRow.appendChild(createTableData(currentKey));
for(elementValue of Object.values(dateElement)){
tableRow.appendChild(createTableData(elementValue));
}
table.appendChild(tableRow);
}
document.body.appendChild(table);
});
}
function createTableData(value){
var tableData = document.createElement('td');
tableData.appendChild(document.createTextNode(value));
return tableData;
}
现在一切都在第一次回调中完成,所以在第一次存储之后一切都是同步的returns