前面一篇文章提到了 JS 的单线程,由于 JS 是单线程,但是总不能让它一直卡着对吧。对于这个问题,解决方法就是使用异步。
console.log(100)setTimeout(function() {console.log(200)}, 1000)console.log(300)console.log(400)// 输出结果// 100// 300// 400// 200
上面的代码中使用了 setTimeout ,这里假设 JS 没有异步(注意,这里是假设)那么遇到 setTimout 之后,程序就在那等 1 秒钟之后才继续执行。问题是程序碰到 setTimeout 之后,总不能在哪傻等吧,因此 JS 通过引入异步来解决这个问题。
使用了异步之后,当遇到 setTimeout 之后,先不管它,先让其它 JS 代码先执行。当执行完所有同步操作之后,发现还有一个 1s 之后才执行的异步操作,那么一秒之后再执行 setTimeout 操作。
再来看一个 Ajax 的例子:
console.log(100)$.ajax({url: 'xxxxx',success: function (result) {console.log(result)}})console.log(300)console.log(400)// 输出结果// 100// 300// 400// ajax 成功加载之后的内容 result
当程序执行到 ajax 操作之后,由于根本不知道 ajax 请求什么时候才加载完毕,因此执行的时候就不会在那傻等,而是继续执行后面的 JS 代码,等到什么时候 ajax 加载完毕, success 回调函数才会执行。
异步的问题
- 异步代码没有按照书写顺序执行,可读性比较差
- callback(回调) 中不容易模块化,如果 callback 中比较复杂的话,就很容易出现代码耦合度高的问题。
