《浅谈异步》

95 阅读2分钟

先说同步

只有忙完手头的任务,才能做下一个任务。这个过程叫同步。

异步

放下手头任务,去完成另一个任务,完成后,再回头做回手头这个任务。这个过程叫异步。

比如

setTimeout(()=>{
    console.log("任务一")
},2000)
console.log("任务二")

当JS引擎执行到setTimeout,发现是个异步任务,则会把任务挂起,继续执行下一个任务。2秒后回调执行打印任务一。

为什么JS要使用异步

由于javascript是单线程的,在AJAX请求过程中,如果没有异步,就会出现用户长时间等待,并且由于当前任务并未完成,所以现在进行其他操作都会无响应。

异步和回调的关系

  • 关联
  1. 异步任务需要在得到结果时通知JS来拿结果
  2. 怎么通知呢?
  3. 可以让JS写留一个函数地址(电话号码)给游览器
  4. 异步任务完成时游览器调用该函数地址即可(拨打电话)
  5. 同时把结果作为参数传给该函数(电话里说可以了)
  6. 这个函数是我写给游览器调用的,所以是回调函数
  • 区别
  1. 异步任务需要用到回调函数来通知结果
  2. 但回调函数不一定只用在异步任务里
  3. 回调可以用到同步任务里

回调的两个结果

方法一:回调接受两个参数

fs.readFile('./1.txt',(error,data)=>{
if(error){console.log("失败"),return}
console.log(data.toString())  //成功
})

方法二:搞两个回调

ajax('get','/1.json',{
    success:()=>{},fail:()=>{}
    //接受一个对象,对象有两个key,表示成功和失败
})

两个回调有三个缺点

  • 不规范,没有成文规定
  • 很容易出现回调地狱,代码变得看不懂
  • 很难进行错误处理