一尘不染

了解NodeJS上的异步/等待

node.js

我认为我对 .NET 的经验可能会影响我的理解async/await,因此我想一些代码示例:

我正在尝试让快速控制器在返回响应之前等待5秒:

const getUsers = async (ms) => {
  var wait = ms => new Promise(resolve => setTimeout(resolve, ms));

  await wait(ms);
};


export const index = (req, res) => {
  async () => {
    await getUsers(5000);

    res.json([
      {
        id: 1,
        name: 'John Doe',
      },
      { id: 2,
        name: 'Jane Doe',
      },
    ]);
  };
};

该代码不起作用,浏览器不断加载和加载,从不显示任何内容。

getUser我基于此SO答案构建的函数以及控制器方法,是基于(对)其工作原理的(错误的)理解,因此我需要进行一些澄清和更正:

1.我应该什么时候使用await

据我了解,您应该awaitasync函数调用之前使用。这样对吗?另外,为什么我可以在返回承诺的非异步函数之前调用await?

2.我async什么时候应该使用?

据我了解,您将一个函数标记为一个函数,async以便可以使用await关键字来调用它。这样对吗?另外,[为什么]我必须将awaitgetUsers(5000)呼叫包装在匿名异步函数中?


阅读 406

收藏
2020-07-07

共1个答案

一尘不染

为了消除一些疑问-

  1. 您可以将其await与任何返回诺言的函数一起使用。您正在等待的功能async不一定是必需的。
  2. asyncawait在函数内使用关键字时,应使用函数。如果您不想await在函数内使用关键字,那么您就不必创建该函数async
  3. async默认情况下,函数返回一个promise。这就是您能够await async运行的原因。

MDN -

调用异步函数时,它将返回一个Promise。

就您的代码而言,它可以这样写:

const getUsers = (ms) => { // No need to make this async
    return new Promise(resolve => setTimeout(resolve, ms));
};

// this function is async as we need to use await inside it
export const index = async (req, res) => {
    await getUsers(5000);

    res.json([
      {
        id: 1,
        name: 'John Doe',
      },
      { id: 2,
        name: 'Jane Doe',
      },
    ]);
};
2020-07-07