Значение browser.storage.local перезаписывается, а не добавляется к - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь написать функцию асинхронного ведения журнала для использования в веб-расширении 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"

Однако на самом деле пишется только второе сообщение.

1 Ответ

0 голосов
/ 19 июня 2019

Извините, что потратил время здесь, но нашел другой вопрос, который, хотя и не требует дублирования, в значительной степени объясняет это. По сути, функции журнала будут сосуществовать, создавая состояние гонки. Для управления этим необходима очередь, так как журналы, запущенные одновременно, имеют случайный вывод в результате того, что browser.storage.local.get из одного журнала вызывается до того, как другой записывает свой вывод. Другой вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...