时间:2021-05-26
想象下,比如浏览器在运行一个复杂的图像转换算法,因为是单线程的,所以此时浏览器进程被阻塞了,不能进行界面渲染,也不能运行其他代码,你的应用界面会失去和用户的交互。
这一般情况下还不会有大问题,但是当浏览器在同时运行多个类似的算法时,这个问题就很严重了。
有一定经验js开发人员大多都理解代码的异步执行,特别是ajax的使用。
// ajax(..) is some arbitrary Ajax function given by a libraryvar response = ajax('https://example.com/api');console.log(response);// `response` won't have the response这里response 将不会得到你想要的结果。
而是需要像相面这样,通过 callback函数的方式,获取结果
ajax('https://example.com/api', function(response) { console.log(response); // `response` is now available});另外这里面提醒一下,下面的代码, async: false永远都不是一个好主意。
// This is assuming that you're using jQueryjQuery.ajax({ url: 'https://api.example.com/endpoint', success: function(response) { // This is your callback. }, async: false // And this is a terrible idea});通过上面的例子,我们应该理解通过 异步 函数,可以帮助我们解决 类似浏览器阻塞问题。
当然还可以通过 setTimeout(callback, milliseconds)实现同样的逻辑。如果你理解了异步,下面代码执行会输出什么呢?
function first() { console.log('first');}function second() { console.log('second');}function third() { console.log('third');}first();setTimeout(second, 1000); // Invoke `second` after 1000msthird();那个这下异步处理机制的原理是什么呢?这里就要引入我们的事件循环Event Loop了
Event Loop有一个简单的Job(task) - 监视Call Stack和Callback Queue。如果调用堆栈为空,它将从队列中取出第一个事件,并将其推送到调用堆栈,从而有效地运行它。
这种迭代在事件循环中被称为Tick。每个事件只是一个函数回调。
console.log('Hi');setTimeout(function cb1() { console.log('cb1');}, 5000);console.log('Bye');执行这段代码,下面的调用栈清楚的演示了事件循环的处理流程。
请注意,setTimeout(...)不会自动将您的回调放在事件循环队列中。
它设置了一个计时器。当计时器到期时,浏览器将你的回调放到事件循环中,以便将来的一些tick会执行。但是,队列中可能还有其他事件已经被添加了 - 您的回调将不会立即执行。
有很多关于开始使用JavaScript中的异步代码的文章和教程,建议您使用setTimeout(callback,0)。
现在你知道Event Loop是怎么做的,以及setTimeout是如何工作的。
你就能更好的理解下面的代码
console.log('Hi');setTimeout(function() { console.log('callback');}, 0);console.log('Bye');尽管等待时间设置为0 ms,但浏览器控制台中的结果如下所示:
Hi
Bye
callback
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了javascript事件循环eventloop的简单模型解释与应用.分享给大家供大家参考,具体如下:js是单线程的,但是eventloop的出现,
本文实例讲述了node.js中对EventLoop事件循环的理解与应用。分享给大家供大家参考,具体如下:javascript是单线程的,所以任务的执行都需要排队
Node.js中定时器的实现上一篇博文提到,在Node中timer并不是通过新开线程来实现的,而是直接在eventloop中完成。下面通过几个JavaScrip
这两天跟同事同事讨论遇到的一个问题,js中的eventloop,引出了chrome与node中运行具有setTimeout和Promise的程序时候执行结果不一
开场白最近在学习libuv,也了解了一些Node.js中使用libuv的例子。当然,这篇文章不会去介绍eventloop,毕竟这些东西在各个论坛、技术圈里都被介