前面一篇文章提到了 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 中比较复杂的话,就很容易出现代码耦合度高的问题。