Сделать инициализацию асинхронной в node.js - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь инициализировать ключевой класс в программе node.js, но инструкции выполняются в произвольном порядке, и поэтому он инициализируется неправильно. Я пробовал сделать инициализацию в определении и в отдельной функции; ни один не работает. Я что-то упускаю?

Текущий код:

class BotState {
    constructor() {
        this.bios = {}
        this.aliases = {};
        this.stories = {};
        this.nextchar = 0;
    }
}

var ProgramState = new BotState();

BotState.prototype.Initialize = function() {
    this.bios = {};
    var aliases = {};
    var nextchar = 0;
    this.nextchar = 0;
    fs.readdir(biosdir, function (err, files) {
        if (err) throw err;
        for (var file in files) {
            fs.readFile(biosdir + file + ".json", {flag: 'r'}, (err, data) => {
                if (err) throw err;
                var bio = JSON.parse(data);
                var index = bio["charid"];
                this.bios[index] = bio;
                for (var alias in bio["aliaslist"]) {
                    this.aliases[bio["aliaslist"][alias].toLowerCase()] = index;
                }
                if (index >= nextchar) {
                    nextchar = index + 1;
                }
            })
        }
        this.stories = {};
        this.nextchar = Math.max(Object.keys(aliases).map(key => aliases[key]))+1;
    });
}

ProgramState.Initialize();

Есть ли какой-нибудь общий способ заставить node.js просто ... запускать команды в порядке их написания? , в отличие от какого-то произвольного?

(Извиняюсь, если код неаккуратный; меня больше интересовало, как заставить его делать правильные вещи, а не выглядеть красиво.)

1 Ответ

0 голосов
/ 16 января 2020

Вы выполняете асинхронную операцию в al oop, которая заставляет l oop продолжать работу, а асинхронные операции заканчиваются sh в некотором случайном порядке, поэтому вы обрабатываете их в некотором случайном порядке. Самый простой способ управления вашим l oop - это переключиться на версию библиотеки fs на основе обещаний, а затем использовать async/await, чтобы заставить for l oop приостановить и дождаться асинхронной операции, чтобы полный. Вы можете сделать это следующим образом:

const fsp = require('fs').promises;

class BotState {
    constructor() {
        this.bios = {}
        this.aliases = {};
        this.stories = {};
        this.nextchar = 0;
    }
}

var ProgramState = new BotState();

BotState.prototype.Initialize = async function() {
    this.bios = {};
    this.nextchar = 0;

    let aliases = {};
    let nextchar = 0;
    const files = await fsp.readdir(biosdir);

    for (const file of files) {
        const data = await fsp.readFile(biosdir + file + ".json", {flag: 'r'});
        const bio = JSON.parse(data);
        const index = bio.charid;
        const list = bio.aliaslist;
        this.bios[index] = bio;
        for (const alias of list) {
            this.aliases[alias.toLowerCase()] = index;
        }
        if (index >= nextchar) {
            nextchar = index + 1;
        }
    }

    this.stories = {};
    // there is something wrong with this line of code because you NEVER
    // put any  data in the variable aliases
    this.nextchar = Math.max(Object.keys(aliases).map(key => aliases[key]))+1;
}

ProgramState.Initialize();

Обратите внимание, есть проблема с использованием локальной переменной aliases, потому что вы никогда ничего не помещаете в эту структуру данных, но пытаетесь использовать ее в последняя строка функции. Я не знаю, что вы пытаетесь сделать там sh, поэтому вам придется это исправить.

Также обратите внимание, что вы никогда не должны использовать for/in для итерации массива. Это повторяет свойства объекта, которые могут включать в себя не только элементы массива. for/of предназначен именно для итерации итерируемого массива, а также сохраняет разыменование массива, поскольку он получает каждое значение, а не каждый индекс.

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