Код: Выделить всё
export const pool = mariadb.createPool({
host: 'localhost',
port: '3306',
user: '*********',
password: '**********'
});
export async function getBodyType(body, conn, map) {
let subType = body.subType || "Other";
if (subType && !map.has(subType)) {
// Insert into the DB as we go, adding it to a set to ensure we don't duplicate
db.insertBodyType(subType, conn)
.then(result => {
map.add(subType);
});
}
return subType;
}
export async function insertBodyType(bodyType, conn) {
try {
await conn.query(queries.bodyTypesInsert, bodyType);
} catch (err) {
console.log(err);
}
}
Код: Выделить всё
await db.insertBodyType(subType, conn);
map.add(subType);
< /code>
Теперь вот как я называю приведенную выше функцию, которая сама не в функции (это всего лишь основная часть сценария): < /p>
let types = new Set();
const stream = fs.createReadStream(inputFile, 'utf8');
const parser = JSONStream.parse('*');
stream.pipe(parser)
// I'm wondering if this is the culprit -- I don't know how to make the call to
// stream.pipe async or even if I can, so I don't know if making its body async even
// matters.
.on('data', async (system) => {
// Array of values we need for the system insert
let systemData = [
system.name,
system.coords.x,
system.coords.y,
system.coords.z,
helpers.isColonizable(system),
helpers.isPopulated(system),
helpers.canColonizeFrom(system)
];
let bodyMap = new Map();
// Somehow this sometimes calls twice before the first one finishes, despite the
// fact that the whole chain from getBodyType() on up should be async
for (let body of system.bodies) {
let bodyType = await helpers.getBodyType(body, conn, types);
if (!bodyMap.has(bodyType)) {
bodyMap.set(bodyType, 0);
}
bodyMap.set(bodyType, bodyMap.get(bodyType) + 1);
}
}
})
.on('end', () => {
db.pool.end();
})
.on('error', (err) => {
db.pool.end();
});
< /code>
Все это запускается в узле: < /p>
$ node do_this.js
Подробнее здесь: https://stackoverflow.com/questions/796 ... on-and-par