#javascript #node.js #asynchronous
#javascript #node.js #асинхронный
Вопрос:
Работая с node и sqlite, у меня есть следующее, которое запрашивает таблицу и возвращает результат:
async function select_from_table(tablename, limit) {
let arr = [];
let sql = `SELECT id FROM ${tablename} WHERE Type='Real' LIMIT ${limit}`;
await db.each(sql, function (err, row) {
console.log(row.id);
arr.push(row.id);
});
return await arr;
}
Это возвращает обещание и, похоже, работает, когда я запускаю его с;
return select_from_table('myData', 5);
однако, когда я пытаюсь запустить его в другом файле после его импорта:
const sqlite = require('./sqlite');
const sel = sqlite.select_from_table;
const myTestUrls = helpers.detailUrls(return sel('myData',3););
Я получаю ошибку, упомянутую выше в заголовке. Как я могу это исправить?
Редактировать:
const myTestUrls = helpers.detailUrls(await sel('myData',3));
^^^^^
SyntaxError: missing ) after argument list
Комментарии:
1.
return arr;
вместоreturn await arr;
2. Что вы ожидаете
return
от оператора в этой позиции? Оператор не может быть аргументом. Также ожидание массива ничего не синхронизирует.3.
await arr
не имеет смысла,arr
не является обещанием. Напротив,db.each
действительно ли возвращает обещание?4.
helpers.detailUrls(return sel('myData',3););
очевидно, это синтаксическая ошибка. Вы имели в видуhelpers.detailUrls(await sel('myData',3));
илиsel('myData',3).then(helpers.detailUrls);
?5. пожалуйста, смотрите Редактирование . также await используется только с обещанием (все еще привыкает к async / await)
Ответ №1:
Просто: return arr;
вместо return await arr;
Массив не является Promise
объектом, и вы не можете ждать не Promise
объекта.
async function select_from_table(tablename, limit) {
let arr = [];
let sql = `SELECT id FROM ${tablename} WHERE Type='Real' LIMIT ${limit}`;
await db.each(sql, function (err, row) {
console.log(row.id);
arr.push(row.id);
});
return arr; // <---------- edit here
}
очевидно db.each()
, должно быть возвращено a Promise
… но я вижу, что вы передаете обратный вызов, и я думаю, что это не обещание. В этом случае правильное ожидание — передать второй обратный вызов для полного события
function select_from_table(tablename, limit) {
return new Promise((resolve, reject) => {
let arr = [];
let sql = `SELECT id FROM ${tablename} WHERE Type='Real' LIMIT ${limit}`;
db.each(sql, function (err, row) {
console.log(row.id);
arr.push(row.id);
}, function(err, rows) {
if( err ) {
reject(err);
} else {
resolve(arr);
}
});
});
}
Здесь другая ошибка:
const myTestUrls = helpers.detailUrls(return sel('myData',3););
правильный синтакс
const myTestUrls = helpers.detailUrls(sel('myData',3));
но помните, что ваша sel()
функция возвращает a Promise
, потому что метод является асинхронным, и если detailUrls()
он не может обработать a Promise
, вам нужно подождать, например.:
const myTestUrls = helpers.detailUrls(await sel('myData',3));
Комментарии:
1. Спасибо, я внес предложенные вами изменения, но получаю ошибку при редактировании.
2. Я ценю, что вы смотрите на это. Я все еще не понимаю, как это работает, и смотрю на npmjs.com/package/sqlite-async