NodeJS асинхронный / ожидание и вызов функции - PullRequest
0 голосов
/ 13 сентября 2018

Я запускаю NodeJS с pg-promise для доступа к моему PostgreSQL.

Это мой тест, который не проходит с undefined:

function a() {
  pgPromise.one('SELECT 1')
  .then(row => {
     return row;
  })
  .catch(error => {
    console.log(error);
  });
}

console.log(a());

Я полагаюон не работает с undefined, потому что он работает асинхронно.

Я пытался оптимизировать с помощью:

async function a() {
  var output = null;
  await pgPromise.one('SELECT 1')
  .then(row => {
     output = row;
  })
  .catch(error => {
    console.log(error);
  });

  return output;
}

console.log(a());

Но это просто дает мне:

[2018-09-13 08:37:09.521] [LOG]   Promise { <pending> }

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

async functions вернуть обещание, поэтому вам нужно дождаться его или использовать .then(), чтобы получить результат.

Помните, что await можно использовать только внутри async function, поэтому вынужно изменить структуру вашего кода.

Я рекомендую вам проверить документацию , а также дополнительную информацию об асинхронном программировании в Javascript.

Сохранение вашего первого кода таким, ономожно исправить следующим образом (на мой взгляд, это немного странно):

function a() {
  return pgPromise.one('SELECT 1')
  .then(row => {
     return row;
  })
  .catch(error => {
    console.log(error);
  });
}

a().then(console.log);

Если вы хотите использовать async / await, этот пример может пригодиться для изучения:

async function a() {
  const row = await pgPromise.one('SELECT 1');
  return row;
}

a().then(console.log).catch(console.error);

В этом случае обработка ошибок выполняется вне функции, на стороне вызывающей стороны (это может быть сделано внутри через try / catch, это зависит от варианта использования).

0 голосов
/ 13 сентября 2018

Вы должны await для результата, чтобы вы не получили обещание, а его результат после его решения:

console.log(await a());

Но ваш код слишком сложен.Ваша a функция не имеет никакого смысла.

Измените

async function a() {
  var output = null;
  await pgPromise.one('SELECT 1')
  .then(row => {
     output = row;
  })
  .catch(error => {
    console.log(error);
  });

  return output;
}

на

async function a() {
  try {
      return await pgPromise.one('SELECT 1')
  } catch(error) {
      console.log(error);
  }
}

Если вы получаете синтаксическую ошибку на await,это, вероятно, означает, что вы не в функции async.Типичный случай в узле, когда вы находитесь в корне.Самое простое решение - обернуть его в функцию async:

;(async function(){
    console.log(await a());
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...