前面一篇文章提到了 JS 的单线程,由于 JS 是单线程,但是总不能让它一直卡着对吧。对于这个问题,解决方法就是使用异步。

  1. console.log(100)
  2. setTimeout(function() {
  3. console.log(200)
  4. }, 1000)
  5. console.log(300)
  6. console.log(400)
  7. // 输出结果
  8. // 100
  9. // 300
  10. // 400
  11. // 200

上面的代码中使用了 setTimeout ,这里假设 JS 没有异步(注意,这里是假设)那么遇到 setTimout 之后,程序就在那等 1 秒钟之后才继续执行。问题是程序碰到 setTimeout 之后,总不能在哪傻等吧,因此 JS 通过引入异步来解决这个问题。

使用了异步之后,当遇到 setTimeout 之后,先不管它,先让其它 JS 代码先执行。当执行完所有同步操作之后,发现还有一个 1s 之后才执行的异步操作,那么一秒之后再执行 setTimeout 操作。

再来看一个 Ajax 的例子:

  1. console.log(100)
  2. $.ajax({
  3. url: 'xxxxx',
  4. success: function (result) {
  5. console.log(result)
  6. }
  7. })
  8. console.log(300)
  9. console.log(400)
  10. // 输出结果
  11. // 100
  12. // 300
  13. // 400
  14. // ajax 成功加载之后的内容 result

当程序执行到 ajax 操作之后,由于根本不知道 ajax 请求什么时候才加载完毕,因此执行的时候就不会在那傻等,而是继续执行后面的 JS 代码,等到什么时候 ajax 加载完毕, success 回调函数才会执行。

异步的问题

  1. 异步代码没有按照书写顺序执行,可读性比较差
  2. callback(回调) 中不容易模块化,如果 callback 中比较复杂的话,就很容易出现代码耦合度高的问题。