Выражение аргумента, ожидаемое с обещанием узла

#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