Вызов асинхронной функции JavaScript с асинхронным/ожиданием при потоковой передаче JSON и SANERSING (NODE.JS)Javascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 Вызов асинхронной функции JavaScript с асинхронным/ожиданием при потоковой передаче JSON и SANERSING (NODE.JS)

Сообщение Anonymous »

Я пытаюсь проанализировать огромный поток JSON в JavaScript с использованием node.js, который затем хранится в MariaDB. В рамках этого у меня есть таблица, которая будет иметь небольшое количество рядов (~ 50), но каждая строка имеет уникальное значение. Таким образом, если я сталкиваюсь с значением во время анализа, мне не нужно добавлять его в DB, ​​если оно уже есть. Когда я сталкиваюсь с значением, я сначала проверяю, чтобы увидеть, находится ли оно в наборе, и если нет, я добавляю его в DB, ​​затем набор. Я пробовал Async/ожидаю, но я подозреваю, что все это обернуто в асинхронном методе, который называется с верхнего уровня файла, поэтому в какой -то момент разрывы в цепочке Async/Await и то, что должно запускать синхронно, больше не выполняет. Помощники

Код: Выделить всё

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
Честно говоря, из того, что я читаю на Async/ожидаю здесь, мне интересно, использую ли я правильный инструмент для работы. Мне может быть лучше использовать что -то вроде C#, которое может справиться с истинной синхронностью с асинхровыми методами, предполагая, что я правильно читаю.


Подробнее здесь: https://stackoverflow.com/questions/796 ... on-and-par
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Javascript»