JS异步处理的进化史深入讲解异步处理的进化史深入讲解
前言前言
javascript是一门单线程的语言,也就是说一次只能完成一件任务,如果有多个任务,就需要排队进行处理。如果一个任务耗
时很长,后面的任务也必须排队等待,这样大大的影响了整个程序的执行。为了解决这个问题,javascript语言将任务分为两
种模式:
同步:当我们打开网站,网页的页面骨架渲染和页面元素渲染,就是一大推同步任务。
异步:我们在浏览新闻时,加载图片或音乐之类占用资源大且耗时久的任务就是异步任务。
本文主要针对近两年javascript的发展,主要介绍异步处理的进化史。目前,在javascript异步处理中,有以下几种方式:
callback
回调函数是最早解决异步编程的方法。无论是常见的setTimeout还是ajax请求,都是采用回调的形式把事情在某一固定的时刻
进行执行。
//常见的:setTimeout
setTimeout(function callback(){
console.log('aa');
}, 1000);
//ajax请求
ajax(url,function callback(){
console.log("ajax success",res);
})
回调函数的处理一般将函数callback作为参数传进函数,在合适的时候被调用执行。回调函数的优点就是简单、容易理解和实
现,但有个致命的缺点,容易出现回调地狱(Callback hell),即多个回调函数嵌套使用。造成代码可读性差、可维护性差且只
能在回调中处理异常。
ajax(url, () => {
//todo
ajax(url1, () => {
//todo
ajax(url2, () => {
//todo
})
})
})
事件监听事件监听
事件监听采用的是事件驱动的模式。事件的执行不取决于代码的顺序,而是某个事件的发生。
假设有两个函数,为f1绑定一个事件(jQuery的写法),当f1函数发生success事件时,执行函数f2:
f1.on('success',f2);
对f1进行改写:
function f1(){
ajax(url,() => {
//todo