Вы выполняете асинхронную операцию в 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
предназначен именно для итерации итерируемого массива, а также сохраняет разыменование массива, поскольку он получает каждое значение, а не каждый индекс.