JavaScript中EventLoop介绍

 更新时间:2018年01月22日 15:05:21   投稿:laozhang  
本篇文章给大家详细介绍了JavaScript中EventLoop的相关知识,有这方面需要的朋友参考学习下。

想象下,比如浏览器在运行一个复杂的图像转换算法,因为是单线程的,所以此时浏览器进程被阻塞了,不能进行界面渲染,也不能运行其他代码,你的应用界面会失去和用户的交互。

这一般情况下还不会有大问题,但是当浏览器在同时运行多个类似的算法时,这个问题就很严重了。

有一定经验js开发人员大多都理解代码的异步执行,特别是ajax的使用。

// ajax(..) is some arbitrary Ajax function given by a library
var 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 jQuery
jQuery.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 1000ms
third();

那个这下异步处理机制的原理是什么呢?这里就要引入我们的事件循环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

相关文章

  • 一不小心就做错的JS闭包面试题

    一不小心就做错的JS闭包面试题

    这篇文章为大家推荐了许多经典的JS闭包面试题,也可以说是一不小心就做错的JS闭包面试题,感兴趣的小伙伴们可以参考一下,自己试着解答这些大部分人都会做错的JS闭包面试题,检验自己的知识水平
    2015-11-11
  • 悟透JavaScript整理版

    悟透JavaScript整理版

    编程世界里只存在两种基本元素,一个是数据,一个是代码。编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力。
    2008-03-03
  • JavaScript实现输入框与清空按钮联动效果

    JavaScript实现输入框与清空按钮联动效果

    本文给大家分享基于js实现输入框与清空框按钮联动效果,非常实用,代码简单易懂,感兴趣的朋友一起看看吧
    2016-09-09
  • 微信小程序实现虎年春节头像制作

    微信小程序实现虎年春节头像制作

    春节来临之际,看到有网友分享了网页版的虎年头像制作工具。本文将为大家介绍一个虎年春节头像制作小程序,文中的示例代码讲解详细,需要的可以参考一下
    2022-02-02
  • Javascript迭代、递推、穷举、递归常用算法实例讲解

    Javascript迭代、递推、穷举、递归常用算法实例讲解

    今天小编就为大家分享一篇关于Javascript迭代、递推、穷举、递归常用算法实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • JavaScript中的finally()方法和Filter()方法详解

    JavaScript中的finally()方法和Filter()方法详解

    finally是 JavaScript 构造中使用的方法try-catch,Filter() 是 JavaScript 中的一种方法,可以通过处理数组轻松提供过滤后的输出数据,本文就给大家详细的介绍一下JavaScript中的finally()方法和Filter()方法,需要的朋友可以参考下
    2023-08-08
  • JavaScript常见的五种数组去重的方式

    JavaScript常见的五种数组去重的方式

    本文主要JavaScript常见的五种数组去重的方式进行一一思路分析实例介绍,易于理解与学习,具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • 用javascript替换URL中的参数值示例代码

    用javascript替换URL中的参数值示例代码

    本篇文章主要是对用javascript替换URL中的参数值示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • JS对象深度克隆实例分析

    JS对象深度克隆实例分析

    这篇文章主要介绍了JS对象深度克隆,结合实例形式分析了JavaScript对象深度克隆的实现方法与相关注意事项,需要的朋友可以参考下
    2017-03-03
  • 不得不分享的JavaScript常用方法函数集(上)

    不得不分享的JavaScript常用方法函数集(上)

    不得不分享的JavaScript常用方法函数集,帮助大家更好的学习javascript程序设计,有兴趣的朋友可以参考一下
    2015-12-12

最新评论