《异步与promise》

112 阅读2分钟

异步

同步

  • 能直接拿到结果
  • 比如在医院挂号,拿到号才能离开窗口
  • 拿到结果才能离开

异步

  • 不能直接拿到结果
  • 比如在餐厅等位,拿到号可以去逛街
  • 轮询:可以每十分钟去餐厅问一下
  • 回调:可以扫码用微信接到通知

回调和轮询都能拿到结果,不过形式不同

异步举例

ajax:

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

回调(callback)

  1. 写给自己的函数,不是回调
  2. 写给别人的函数,才是回调
  3. request.onreadystatechange是写给浏览器调用的
  4. 意思就是浏览器回头调用一下这个函数
  5. 写了却不调用,而是给别人调用的函数,就是回调函数

回调举例

1665655059(1).png

  • 把f1传给f2,f2调用了f1
  • f1是回调函数

异步和回调的关联

  • 异步任务要用回调方法把结果通知给刚才走了的js代码
    • 异步任务需要在得到结果是通知js回来拿结果
    • 让js留一个函数地址给浏览器
    • 异步任务完成时浏览器调用该函数地址
    • 同时把结果作为参数传给该函数
    • 这个函数是写给浏览器调用的
    • 所以是回调函数

异步和回调的区别

  1. 异步任务需要回调函数通知结果
  2. 但回调函数不一定只用在异步任务里
  3. 回调可以用在同步任务
  4. 例:array.forEach(n=>console.log(n))

判断异步函数

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

  1. setTimeout

  2. AJAX(即XMLHttpRequest)

  3. AddEventListener

    就是回调函数

总结

  1. 异步任务不能拿到结果
  2. 于是我们传一个回调函数给异步任务
  3. 异步任务完成时,函数回调
  4. 调用的时候把结果作为参数

如果异步任务有成功和失败两个结果怎么办

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

image.png

  • 方法二:
    • 搞两个回调

1665656166(1).png

两个方法的不足

  1. 不规范,名称五花八门
  2. 容易出现回调地狱,代码看不懂
  3. 很难进行错误处理

promise

  1. return new promise ((resolve,reject)=>{...})
  2. 任务成功时调用 resolve(result)
  3. 任务失败是调用 reject (error)
  4. resolvr和reject会再去调用成功和失败函数
  5. .then(success,fail)传入成功和失败函数

axios

目前最新的AJAX库

  • 代码示例
    • axios.get('./xxx').then(response=>console.log(response))