Вы можете сделать генератор async
, затем await
Обещание, которое разрешается со всеми строками (так что у вас есть ссылка на переменную rows
на верхнем уровне dbEach
), а затем вы можете получить каждая строка в этом массиве rows
:
async function* dbEach(db, query) {
const rows = await new Promise((resolve, reject) => {
const rows = [];
db.each(query, (err, row) => {
if (err) reject(err);
else rows.push(row);
}, () => resolve(rows));
});
for (const row of rows) {
yield row;
}
}
Использовать с:
for await (const row of dbEach(...)) {
// do something
}
Похоже, .each
предназначен для запуска обратного вызова в каждой строке, что не совсем оптимально для того, что вы пытаетесь сделать здесь с помощью генератора - если это возможно, было бы здорово, если бы существовал метод в вашей базе данных, что позволяет вам получить массив строк вместо, например:
async function* dbEach(db, query) {
const rows = await new Promise((resolve, reject) => {
db.getAllRows(query, (err, rows) => {
if (err) reject(err);
else resolve(rows);
});
});
for (const row of rows) {
yield row;
}
}
Хотя я не думаю, что генератор здесь очень помогает - вы также можете просто await
Обещание, которое разрешает строки и выполняет итерацию по строкам синхронно:
function getRows(db, query) {
return new Promise((resolve, reject) => {
db.getAllRows(query, (err, rows) => {
if (err) reject(err);
else resolve(rows);
});
});
}
const rows = await getRows(...);
for (const row of rows) {
// ...
}