了解NodeJS上的异步/等待

Chr*_*sco 8 javascript asynchronous node.js async-await

我想我对它的理解可能是由我与经验所影响.NETasync/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',
      },
    ]);
  };
};
Run Code Online (Sandbox Code Playgroud)

此代码不起作用,浏览器保持加载和加载,从不显示任何东西.

getUser我根据这个SO答案和控制器方法建立的功能,基于我(错误的)理解它的工作方式,所以我想要一些澄清和纠正:

我应该什么时候使用await

据我所知,你应该awaitasync函数调用之前使用.它是否正确?另外,为什么我可以在返回promise的非异步函数之前调用await?

我应该什么时候使用async

根据我的理解,您将一个函数标记为一个函数,async以便可以使用await关键字调用它.它是否正确?另外,[为什么]我必须await getUsers(5000)在匿名异步函数中包装我的调用?

Jyo*_*ngh 11

澄清一些疑惑 -

  1. 您可以使用await任何返回promise的函数.您正在等待的功能async不一定是必需的.
  2. 如果要在该函数中async使用await关键字,则应使用函数.如果您不打算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',
      },
    ]);
};
Run Code Online (Sandbox Code Playgroud)


Wil*_*een 5

Javascript 中的异步函数

async关键字变成一个普通JS函数声明为异步函数声明:

function syncFunc {// dostuff}
async function asyncFunc {// dostuff} // the async keyword is placed before the function keyword
Run Code Online (Sandbox Code Playgroud)

异步函数返回一个 Promise:

  • 当 async 函数返回一个值时,Promise 将使用返回值进行解析。
  • 当 async 函数抛出异常或某个值时,Promise 将被抛出的值拒绝。

在异步函数中,您可以使用await关键字。await放置在承诺之前会导致异步函数暂停,直到承诺完成(被拒绝或完成)

  • . 当promise fullfillsawait表达式的值就是fullfill 的promise 的值。
  • 当承诺被拒绝时,await表达式会抛出被拒绝的值。

例子:

function syncFunc {// dostuff}
async function asyncFunc {// dostuff} // the async keyword is placed before the function keyword
Run Code Online (Sandbox Code Playgroud)

何时使用异步函数:

当您有多个相互依赖的异步操作(作为承诺实现)时,异步函数是一个有用的工具。例如,当您的第二个承诺需要您的第一个承诺将提供的数据时。您现在可以方便地使用await关键字首先接收 promise 1 中的数据,然后将此数据作为参数传递给 promise 2。

换句话说,异步函数可以通过await关键字使异步编程表现得像同步编程。因此,您的应用程序更易于理解。