【问题标题】:NodeJS async/await and function callNodeJS async/await 和函数调用
【发布时间】:2019-02-17 23:02:26
【问题描述】:

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

【问题讨论】:

  • 您使用不返回任何内容的函数调用 console.log(a())。你期待什么?当然会打印undefined

标签: node.js asynchronous pg-promise


【解决方案1】:

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

【讨论】:

  • 我收到console.log(await a()); ^^^^^ SyntaxError: missing ) after argument list
  • 似乎可以工作,但是哇,将 pg-promise 包装在全局函数中似乎是一个非常好的技巧。
  • 异步函数 a() { try { return await pgPromise.one('SELECT 1') } catch error) { console.log(error); } }
  • @AlfredBalle 你只需要在根目录。其余的一切都应该是异步的,你知道的。对于 REPL 应用程序,我总是使用修饰符启动节点:node --experimental-repl-await myapp.js
  • @AlfredBalle 在使用 async/await 之前,最好先了解异步代码的工作原理。除非您非常乐意将整个代码包装在一个单一的全局函数中。 (注意:您可能会发现执行多个全局函数包装器也无法按预期工作。它必须是单个全局函数包装器)
【解决方案2】:

async functions 返回一个 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 在内部完成,这取决于用例)。

【讨论】:

    猜你喜欢
    • 2021-03-10
    • 2017-12-17
    • 1970-01-01
    • 2022-11-23
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多