了解NodeJS上的asynchronous/等待

我想我的理解可能会受到我的.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', }, ]); }; }; 

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

我基于这个SO回答build立的getUser函数,以及基于我错误地理解它的工作原理的控制器方法,所以我想澄清一下:

我什么时候该用await

据我的理解,你应该在async函数调用之前使用await 。 它是否正确? 另外,为什么我可以在返回promise的非asynchronous函数之前调用await?

2.什么时候应该使用async

就我的理解,你将一个函数标记为async函数,以便使用await关键字来调用函数。 它是否正确? 此外,[为什么我必须包裹我的await getUsers(5000)调用匿名asynchronousfunction?

为了澄清一些疑问 –

  1. 你可以使用任何返回promise的函数来await 。 您正在等待的function不一定是async
  2. 当你想在该函数中使用await关键字时,应该使用async函数。 如果你不会在一个函数中使用await关键字,那么你不需要使这个函数async
  3. async函数默认返回一个promise。 这就是你能够await asyncfunction的原因。

从MDN –

当一个asynchronous函数被调用时,它返回一个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', }, ]); }; 

asynchronous等待只是承诺的语法糖。

当你希望你的代码在完整的函数上运行时,你可以像使用promise一样使用它们。

 async function asyncOperation(callback) { const response = await asyncStep1(); return await asyncStep2(response); } 

如果您使用promises land语法,确切的事情是:

 function asyncOperation() { return asyncStep1(...) .then(asyncStep2(...)); } 

新的asynchronous/等待语法允许您仍然使用Promise,但是它消除了对链接的then()方法提供callback的需要。

callback是直接从asynchronous函数返回,就好像它是一个同步阻塞函数一样。

 let value = await myPromisifiedFunction(); 

当你打算在你的函数中使用await时,你应该用async关键字标记你的函数(就像在C#中一样)

你不必创build你的getUsers作为匿名函数。