我正在尝试编写一个异步记录器功能,以便在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"
的字符串
但是实际上只写了第二条消息。
答案 0 :(得分:0)
很抱歉在这里浪费时间,我发现了另一个问题,尽管不需要重复,但可以解释很多问题。基本上,日志功能将共存,从而创建竞争条件。需要一个队列来管理它,因为日志同时运行,由于一个日志被调用,而其他日志写入其输出之前的browser.storage.local.get却具有随机输出。 Other Question