js异步编程的几种实现方式

705 阅读2分钟

js异步

由于js设计之初就为单线程,所以所有任务都会依次执行,这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方,其他任务无法执行。这样效率是非常低的,所以js想出了一个解决办法,将任务的执行模式分成了同步和异步。js是如何实现异步的呢下面是几种异步的实现方法。

js实现异步的方式

原生的javascript 实现异步的方式, 大可以分3类:

  1. 延迟类型:setTimeout(setInterval也是可以的)、requestAnimationFrame(用于浏览器下一次渲染页面之前调用,参数为回调函数,用于动画)、setImmediate(IE10及以上)
  2. 监听事件实现的类型:监听newImage加载状态、监听script加载状态、监听iframe加载状态、Message
  3. 带有异步功能类型 Promise、ajax(XMLHttpRequest、ActiveXObject)、Worker;

1、回调函数

最常见的异步实现方法,就是回调函数。解决的问题自然也就是一个任务耗时很长,为了不影响后面的任务执行,我们可以把它封装成一个函数f1,用一个回调函数f2来接受f1的返回结果。

function f1(callback){
    setTimeout(() => {
        callback(1);
    }, 1000);
}
f1(function(res){
    console.log(res);
}) //1

回调函数很好的解决了f1耗时的问题,不回影响到后续任务的执行。优点是简单,容易理解,缺点是代码之间关联性强,不易于阅读和维护,每个任务只能指定一个回调函数。

2、promise