异步与promise

466 阅读2分钟

什么是异步什么是同步

  • 同步:如果能直接拿到结果就是同步
  • 异步:不能直接拿到结果

异步举例

  • 以AJAX为例

    request.send()之后并不能直接得到response,必须等到readystate变为4之后,浏览器才会回头调用request.onreadystatechange函数。

  • 回调callback

    写给自己用的函数,不是回调,写给别人用的函数是回调。比如request.onreadystatechange就是我写给浏览器调用的函数。

异步和回调的关系

  • 关联

    异步任务需要在得到结果时通知js来取,这时我们可以给js留一个函数地址,异步任务完成时浏览器调用该函数地址,同时把结果作为参数传给该函数,这里的函数是我写给浏览器调用的,所以时回调函数。

  • 区别

    异步任务需要用到回调函数来通知结果 但回调函数不一定只用在异步任务里,也可以用到同步任务中 arr.forEach(n=>console.log(n)) 就是同步回调

判断同步异步

  • 如果一个函数的返回值处于

    1.setTimeout

    2.AJAX(即XMLHttpRequest)

    3.addEventListener 这三个值的内部就是异步函数。

    注意:不要把AJAX设置成同步的,这样会使页面卡住

总结

  • 异步任务不能拿到结果
  • 于是传一个回调给异步任务
  • 异步完成时调用回调
  • 调用时把结果作为参数

promise(解决异步任务的两个结果:成功或失败)

解决异步任务的回调问题

  • 规范回调的名字或顺序
  • 拒绝回调地狱,让代码的可读性更高
  • 很方便的捕获任务

以AJAX为例解释promise

核心就是 这一句话

总结

  • 第一步

    1.return new Promise((resolve,reject)=>{...})

    2.任务成功调用resolve(result)

    3.任务失败调用reject(onerror)

    4.resolve和reject会再去调用成功和失败函数

  • 第二步

    使用.then(success,fail)传入成功和失败函数

封装AJAX的缺点

  • .post无法上传数据(request.send可以上传)
  • 不能设置请求头(request.setRequestHeader(key,value))

解决方法

  • jQuery.ajax

  • axios(目前最新的ajax库)

    代码示例

    优点:自动调用JSON.parse,请求拦截器;响应拦截器