【发布时间】:2019-06-18 13:02:05
【问题描述】:
我正在尝试编写一个异步记录器函数以用于 Firefox Web 扩展,该扩展除了控制台输出之外还写入记录消息的持久副本。它维护所有以前创建的日志,使用 Date() 字符串命名它们。 (在我开始工作后计划使用旋转机制)。
Log() 函数在运行时应该将一条消息附加到当前日志并在browser.storage.local.get(window.logFile) 中反映这一点。
但是,只有最后记录的消息被记录,它会用它覆盖日志。抱歉这个有这么多代码,但是少了就看不下去了。
我尝试过使函数不是异步的,而不是等待它。我发现内部函数 work(obj) 每次都从它的 promise 中接收一个空对象,但我不知道为什么。
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" 的字符串
但是实际上只有第二条消息被写入。
【问题讨论】:
标签: javascript logging firefox-addon-webextensions