Я пытаюсь написать функцию асинхронного ведения журнала для использования в веб-расширении Firefox, которое записывает постоянные копии зарегистрированных сообщений в дополнение к выводу на консоль. Он поддерживает все ранее созданные журналы, присваивая им имена, используя строки Date (). (Механизм вращения планируется после того, как я получу эту работу).
Функция Log () при запуске должна добавить сообщение в текущий журнал и отразить это в browser.storage.local.get(window.logFile)
.
Однако записывается только последнее зарегистрированное сообщение, оно перезаписывает журнал вместе с ним. Извините, у этого так много кода, но на него нельзя смотреть меньше.
Я попытался сделать функцию не асинхронной и не ждать ее. Я обнаружил, что внутренняя функция work (obj) каждый раз получает пустой объект из своего обещания, но я не знаю почему.
function isEmpty(obj) {
// isEmpty(obj)
// Checks if an object is empty.
// EX: var a = {};
// returns true or false
if (Object.entries(obj).length === 0) {
if (obj.constructor === Object) {
return true;
}
}
return false;
}
async function Log(message, level) {
// Log(message, level)
// Primary logging facility for the program
// Use instead of console.log to allow exportable output
// Arguments:
// message:
// A string.
// level:
// A string. Valid levels are:
// "error", "warn", "log", "info", "debug"
//
"use strict";
function work(obj) {
// Does the actual work, called as onResolve handler for a promise.
console.log(obj);
var oldLog;
var newLog;
if (!isEmpty(obj)) {
console.info("Not Empty");
oldLog = obj[window.logFile];
} else {
console.info("empty");
oldLog = "";
}
switch (level) {
case "error":
newLog = oldLog + level + ":: " + message + "\n";
console.error(message);
browser.storage.local.set({[window.logFile]: newLog});
break;
case "warn":
newLog = oldLog + level + ":: " + message + "\n";
console.warn(message);
browser.storage.local.set({[window.logFile]: newLog});
break;
case "info":
newLog = oldLog + level + ":: " + message + "\n";
console.info(message);
browser.storage.local.set({[window.logFile]: newLog});
break;
case "debug":
newLog = oldLog + level + ":: " + message + "\n";
console.debug(message);
browser.storage.local.set({[window.logFile]: newLog});
break;
default:
newLog = oldLog + level + ":: " + message + "\n";
console.log(message);
browser.storage.local.set({[window.logFile]: newLog});
}
}
if (typeof(window.logFile) !== "string") {
window.logFile = "" + new Date();
console.log(window.logFile + "\n Program started.");
let getLogs = browser.storage.local.get("allLogs");
getLogs.then((obj) => {
console.log(obj);
if (!isEmpty(obj)) {
obj.allLogs.push(window.logFile);
browser.storage.local.set(obj);
} else {
browser.storage.local.set({allLogs: [window.logFile]});
}
});
}
console.log(window.logFile);
//browser.storage.local.get(window.logFile).then(work);
work(await browser.storage.local.get(window.logFile));
}
Log("logger loaded", "debug");
Log("logger should have two messages", "debug");
Я ожидаю, что результат двух нижних вызовов вызовет значение для browser.storage.local.get(window.logFile)
, которое содержит строку с "debug:: logger loaded\ndebug:: logger should have two messages"
Однако на самом деле пишется только второе сообщение.