NodeJS async/await 和函数调用

NodeJS async/await and function call

我 运行 NodeJSpg-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> }

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

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

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

我建议您查看 documentation 以及 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 在内部完成,这取决于用例)。