js异步
由于js设计之初就为单线程,所以所有任务都会依次执行,这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。这样效率是非常低的,所以js想出了一个解决办法,将任务的执行模式分成了同步和异步。js是如何实现异步的呢下面是几种异步的实现方法。
js实现异步的方式
原生的javascript 实现异步的方式, 大可以分3类:
- 延迟类型:setTimeout(setInterval也是可以的)、requestAnimationFrame(用于浏览器下一次渲染页面之前调用,参数为回调函数,用于动画)、setImmediate(IE10及以上)
- 监听事件实现的类型:监听newImage加载状态、监听script加载状态、监听iframe加载状态、Message
- 带有异步功能类型 Promise、ajax(XMLHttpRequest、ActiveXObject)、Worker;
1、回调函数
最常见的异步实现方法,就是回调函数。解决的问题自然也就是一个任务耗时很长,为了不影响后面的任务执行,我们可以把它封装成一个函数f1,用一个回调函数f2来接受f1的返回结果。
function f1(callback){
setTimeout(() => {
callback(1);
}, 1000);
}
f1(function(res){
console.log(res);
}) //1
回调函数很好的解决了f1耗时的问题,不回影响到后续任务的执行。优点是简单,容易理解,缺点是代码之间关联性强,不易于阅读和维护,每个任务只能指定一个回调函数。