browser.storage.local值被覆盖,而不是附加到

时间:2019-06-18 13:02:05

标签: javascript logging firefox-webextensions

我正在尝试编写一个异步记录器功能,以便在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"的字符串

但是实际上只写了第二条消息。

1 个答案:

答案 0 :(得分:0)

很抱歉在这里浪费时间,我发现了另一个问题,尽管不需要重复,但可以解释很多问题。基本上,日志功能将共存,从而创建竞争条件。需要一个队列来管理它,因为日志同时运行,由于一个日志被调用,而其他日志写入其输出之前的browser.storage.local.get却具有随机输出。 Other Question