代码之家  ›  专栏  ›  技术社区  ›  Alfred Balle

NodeJS async/await和函数调用

  •  0
  • Alfred Balle  · 技术社区  · 6 年前

    我在跑步 NodeJS 具有 pg-promise 访问我的 PostgreSQL .

    这是我的测试,它失败了 undefined

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

    我猜它失败了 因为它是异步运行的。

    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 回复  |  直到 6 年前
        1
  •  2
  •   Alexis Wilke    5 年前

    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);
      }
    }
    

    等待 async 功能。node中的一个典型情况是当您位于根节点时。最简单的解决办法是把它包起来 异步 功能:

    ;(async function(){
        console.log(await a());
    })();
    
        2
  •  1
  •   Antonio Val    6 年前

    async functions 回报一个承诺,所以你需要等待它或使用它 .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);