异步任务就是无法直接拿到结果的任务,于是我们通常会传一个回调给异步任务,异步任务完成时调用回调,调用的时候把结果作为参数传给回调。那么如果异步任务有两个结果成功或失败,怎么办呢?回调搞两个参数?或者搞两个回调?

    不管方法一还是方法二,都有如下问题。

    1. 不规范,名称五花八门,有人用success+error,有人用success+fail,有人用done+fail
    2. 容易出现回调地狱,代码变得看不懂
    3. 很难进行错误处理

    由于以上这些原因,前端程序员开始翻书了,1976年,Daniel P.Friedman和David Wise俩人提出了Promise思想,后人基于此发明了Future、Delay、Deferred等,前端结合Promise和JS,制订了Promise/A+规范,该规范详细描述了Promise的原理和使用方法。

    1. ajax = (method,url,options)=>{
    2. return new Promise((resolve, reject)=>{
    3. const {success,fail} = options
    4. const request = new XMLHttpRequest()
    5. request.open(method,url)
    6. request.onreadystatechange = ()=>{
    7. if(request.readyState === 4){
    8. if (request.status < 400){
    9. resolve.call(null,request.response)
    10. }else if(request.status >= 400){
    11. reject.call(null,request)
    12. }
    13. }
    14. }
    15. request.send()
    16. })
    17. }

    调用时只需 ajax('get','/xxx').then((request)=>{},(request, status)=>{})

    我们封装的ajax很简陋,缺点是无法post上传数据,不能设置请求头…
    有许多优秀的封装AJAX的库,如jQuery.ajax、axios…