【问题标题】:browser.storage.local value getting overwritten instead of appended tobrowser.storage.local 值被覆盖而不是附加到
【发布时间】: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


    【解决方案1】:

    很抱歉在这里浪费时间,我发现了另一个问题,虽然不完全重复,但几乎可以解释它。基本上,日志函数会共存,从而产生竞争条件。需要一个队列来管理这一点,因为同时运行的日志具有随机输出,因为 browser.storage.local.get 在另一个日志写入输出之前从一个日志被调用。 Other Question

    【讨论】:

      猜你喜欢
      • 2015-09-11
      • 2015-03-21
      • 2017-10-19
      • 1970-01-01
      • 2015-05-25
      • 2020-07-01
      • 1970-01-01
      • 2013-02-09
      • 2011-12-17
      相关资源
      最近更新 更多