当前位置: 首页 > 面试题库 >

了解NodeJS上的异步/等待

周博达
2023-03-14
问题内容

我认为我对 .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)呼叫包装在匿名异步函数中?


问题答案:

为了消除一些疑问-

  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',
      },
    ]);
};


 类似资料:
  • 问题内容: 我们如何才能在传递给事件发射器的回调中结束函数 而又不使事件发射 器 散布 ? 另外,无需使用 外部模块 ,只需使用普通的 NodeJS 7.x / 8.x (支持 Es6 语法和。 我们基本上希望将an 与事件发射器混合使用,以便在事件发射器发出信号时解析它。 另外请记住,在使用其他异步功能完成之前,我们不会从事件发射器开始。 如果我们有一个“新的Promise(…)”,我们将调用r

  • 我有这个简单的例子给我的控制器,并没有像预期的那样工作 输出:开始、结束、中间 期望:开始、中间、结束

  • 但是,了解node.js事件循环会发现: 当然,在后端,有用于DB访问和进程执行的线程和进程。 在C#中,编写带有标记的函数和带有的调用就足够了,这样.NET就可以将它放在另一个线程中。但是,node.js中组织方式不同的东西让我很困惑,async/await函数仍然会阻塞主线程。

  • 我一直试图理解C#中的Async/await和Task,但尽管看了youtube视频,阅读了文档,并参加了pluralsight课程,但一直失败得很厉害。 我希望有人能帮助回答这些稍微抽象的问题,帮助我的大脑摆脱困境。 1.为什么说async/await启用了一个“Asynchonrous”方法,而async关键字本身什么也不做,而await关键字添加了一个挂起点?添加挂起点不是强制方法同步操作,

  • 存储库: 数据:

  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)