javascript – async / await会阻塞线程node.js
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – async / await会阻塞线程node.js,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2283字,纯文字阅读大概需要4分钟。
内容图文
![javascript – async / await会阻塞线程node.js](/upload/InfoBanner/zyjiaocheng/706/6233aa620fee49049970f6d946f56ab2.jpg)
当在node.js函数中使用async / await时,它是否会阻塞node.js线程,直到它执行下一行代码?
解决方法:
async / await不会阻止整个解释器. node.js仍然将所有Javascript作为单线程运行,即使某些代码在async / await上等待,其他事件仍然可以运行其事件处理程序(因此node.js不会被阻止).事件队列仍在为其他事件提供服务.实际上,它将是一个事件,它解决了一个允许等待停止等待并运行以下代码的承诺.
像这样的代码:
await foo(); // foo is an async function that returns a promise
console.log("hello");
类似于:
foo().then(() => {
console.log("hello");
});
因此,等待只是将该范围中的以下代码放入一个不可见的.then()处理程序中,其他所有内容的工作方式与使用.then()处理程序实际编写的内容完全相同.
因此,await允许您保存.then()处理程序的写入并为代码提供同步外观(尽管它不是真正的同步).最后,它是一种速记,可让您使用较少的代码行编写异步代码.人们确实需要记住,任何可以拒绝的承诺必须在它周围的某个地方有一个try / catch来捕获和处理拒绝.
从逻辑上讲,您可以考虑在执行函数时遇到await关键字时node.js执行的操作如下:
>进行函数调用
>解释器看到该函数被声明为异步,这意味着它将始终返回一个promise.
>解释器开始执行该功能.
>当遇到await关键字时,它会暂停该函数的进一步执行,直到正在等待的promise被解决.
>然后该函数返回一个未解决的promise.
>此时,解释器继续执行函数调用之后的任何内容(通常是fn().then()后面跟着其他代码行). .then()处理程序尚未执行,因为尚未解析承诺.
>在某些时候,这个Javascript序列完成并将控制权返回给解释器.
>解释器现在可以自由地从事件队列中提供其他事件.进入await关键字的原始函数调用仍处于暂停状态,但现在可以处理其他事件.
>在未来的某个时刻,正在等待的原始承诺得到解决.当在事件队列中处理该事件时,先前挂起的函数在等待之后继续在该行上执行.如果还有await语句,那么函数执行将再次暂停,直到该promise得到解决.
>最终函数命中一个return语句或到达函数体的末尾.如果存在返回xxx语句,则评估xxx,其结果将成为此异步函数已返回的promise的已解析值.该函数现在已完成执行,并且之前返回的承诺已得到解决.
>这将导致任何附加到此函数先前返回的promise的.then()处理程序被调用.
>在那些.then()处理程序运行之后,最终完成了这个异步函数的工作.
因此,虽然整个解释器没有阻塞(其他Javascript事件仍然可以被服务),但是包含await语句的特定异步函数的执行被暂停,直到等待的promise被解决.重要的是要理解上面的步骤5.当第一个await被命中时,该函数在执行此函数之后立即返回未解析的promise和代码(在等待的promise被解析之前).出于这个原因,整个翻译都没有被阻止.执行继续.只有一个函数的内部才会被暂停,直到承诺得到解决.
内容总结
以上是互联网集市为您收集整理的javascript – async / await会阻塞线程node.js全部内容,希望文章能够帮你解决javascript – async / await会阻塞线程node.js所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。