NodeJS异步/等待和函数调用

时间:2018-09-13 08:41:18

标签: node.js asynchronous pg-promise

我正在与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 :(得分:2)

您必须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());
})();

答案 1 :(得分:1)

async functions返回一个Promise,因此您需要等待它或使用.then()来获得结果。

请记住,await只能在async function内部使用,因此您需要更改代码的结构。

我建议您检查documentation以及有关Java异步编程的更多信息。

保持这样的第一个代码,就可以这样修复(我认为还是有点奇怪):

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

a().then(console.log);

如果您想使用异步/等待,此示例可能对学习有帮助:

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

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

在这种情况下,错误处理是在函数外部,调用方进行的(可以通过try / catch在内部完成,具体取决于用例)。