了解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?
为了澄清一些疑问 –
- 你可以使用任何返回promise的函数来
await
。 您正在等待的function不一定是async
。 - 当你想在该函数中使用
await
关键字时,应该使用async
函数。 如果你不会在一个函数中使用await
关键字,那么你不需要使这个函数async
。 -
async
函数默认返回一个promise。 这就是你能够await
async
function的原因。
从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作为匿名函数。
- nodejsasynchronous同一个参数的函数数组?
- 在NodeJs 8. *如何在http.get上应用Async / Await?
- 节点asynchronous推送循环
- 尝试了解更多关于Javascript -Node.jsasynchronous调用堆栈
- 每个和callback
- 在Async瀑布中调用最后的callback有没有什么坏处?
- 在同一个node.js程序中调用asynchronus和synchronus函数
- 我应该在使用asynchronous队列时使用callback吗?
- DeprecationWarning:不build议调用不带callback的asynchronous函数。 – 如何find“function:”在哪里?