es7 promise和async

知识点补充

  1. 对象.then/success:请求成功
    对象.catch:请求失败

  2. 当两个都是resolve时返回resolve的值,如果有reject,返回第一个reject的值

promise

  1. promise对象相当容器 ,产生的结果是异步结果 ,里面封装的是异步编程
  2. 使用:resolve reject 为两个回调函数,分别在成功和失败时返回
/*1.promise*/
  let promise=new Promise(function (resolve,reject) {
      if(true){
          resolve("这里是之后的后台数据");
      }
      else{
          reject("请求失败");
      }
  });
  promise.then(function (res) {
      console.log(res);
  },function(err){
      console.log(err);
  });
  1. 如果其中有定时器,请求成功后的数据返回可以作为计时器的第三个参数
let promise=new Promise(function (resolve,reject) {
    setTimeout(resolve,1000,"data");
});
promise.then(function(res){
    console.log(res);//data
})
  1. 如果要检测异常,则需要使用catch语句处理异常;
    一个promise只能处理一个请求(只能处理一个异步请求)
let promise=new Promise(function (resolve,reject) {
    try{
       if(true){
           setTimeout(resolve,1000,"data");
       }
        else{
           throw new Error("数据请求失败");
       }
    }
    catch(err){
        reject(err);
    }
});
promise.then(function(res){
    console.log(res);//data
}).catch(function (err) {
    console.log(err);
})
  1. promise对象的执行顺序
    原理:异步请求内部的数据在外面也能拿到
let data=null;
let promise=new Promise(function (resolve,reject){
 console.log("start-1");
 setTimeout(resolve,300,"内部的数据-4")
});
console.log("外部-2");
promise.then(function (res){
 console.log(res);
 data=res;
});
console.log("外部结束-3");
console.log(data);// null-5
  1. 异步加载图片
/*3.图片异步加载*/
let promise = new Promise(function (reslove, reject) {
    let img = new Image();
    img.src = "./img/baidu.png";
    img.onload = function () {
        setTimeout(reslove,500,img);
    };
    img.onerror = function (err) {
        reject(new Error("图片加载失败!"))
    };
});
promise.then(function (res) {
    console.log(res);//reslove
}).catch(function (err) {
    console.log(err);
})

在这里插入图片描述
7. 原生ajax promise 封装(将五步法写在promise中并在最后return 一个promise对象)

const post = function (url, data) {
    const promise = new Promise(function (resolve, reject) {
        let http = new XMLHttpRequest();
        let handle = function () {
            if (http.readyState != 4) {
                return;
            }
            if (http.status == 200) {
                resolve(http.response);
            }
            else {
                reject(new Error("数据请求失败"));
            }
        }
        http.open("post", url);
        http.onreadystatechange = handle;
        http.responseType = "json";
        if (data) {
            http.send()
        }
        else {
            http.send();
        }
    });
    return promise;
}
post("stu.json").then(function (res) {
    console.log(res);
}).catch(function (err) {
    console.log(err);
});
  1. 多个promise连用
const p1 = new Promise(function (resolve, reject) {
       setTimeout(resolve, 5000, "第一个数据加载完成");
   });
   const p2 = new Promise(function (resolve, reject) {
       setTimeout(resolve, 1000, p1);
   });
p2.then(function (res) {
 console.log(res);//p2等待p1结束
})
  1. Promise的原型,thencatchfinally
console.log(Promise.prototype);

在这里插入图片描述

(函数的回调函数是他自己的构造函数,其中包含resolve和reject)

  1. Promise.all() ;多个promise对象合并
    在这里插入图片描述

合并promise对象时的返回值没有直接修改p1,而是修改p1点出来的then方法里面的res

.then会创建一个新的promise;如果直接点p1=new promise(……).then.catch(),相当于let p3=p1.then(),此时输出p1,p3的valueundefined没有值;没有拿到then创建的新的promisevalue

const p1 = new Promise(function (resolve, reject) {
    setTimeout(resolve, 1000, "学生");
}).then(function (res) {
        });
console.log(p1);//value:undefined
const p1 = new Promise(function (resolve, reject) {
    setTimeout(resolve, 1000, "学生");
});
let p3= p1.then(function (res) {

});
console.log(p3);//[[PromiseValue]]: undefined

因为p1,p3都相当于两个没有value值的新的promise对象,而在rerurn内给一个返回值相当于把then方法内部的新的promise对象的返回值给当前定义的promise对象的value;所以就显示成功

Then方法底层源码

//promise   then的源码
            function Promise(fn) {
               // ...
                this.then = function (onFulfilled, onRejected) {
                    var self = this;
                    return new Promise(function (resolve, reject) {
                        return self.done(function (result) {
                            if (typeof onFulfilled === 'function') {
                                try {
                                    return resolve(onFulfilled(result));
                                } catch (ex) {
                                    return reject(ex);
                                }
                            } else {
                                return resolve(result);
                            }
                        }, function (error) {
                            if (typeof onRejected === 'function') {
                                try {
                                    return resolve(onRejected(error));
                                } catch (ex) {
                                    return reject(ex);
                                }
                            } else {
                                return reject(error);
                            }
                        });
                    });
                }

            }

其中 done方法的源码为:

//    done  源码
            this.done = function (onFulfilled, onRejected) {
                // ensure we are always asynchronous
                setTimeout(function () {
                    handle({
                        onFulfilled: onFulfilled,
                        onRejected: onRejected
                    });
                }, 0); 
            }

例题:

因为then返回了一个新的promise对象,如果下一个then要使用上一个then(即返回的新的promise对象),就要return
res;

const p = new Promise(function (resolve, reject) {
 setTimeout(resolve, 1000, "数据");
}).then(function (res) {//数据  此时已经新建了一个promise对象
         console.log(res);
         return res;
        }).then(function (res) {
         console.log(res);// 数据 输出上一个then新建的promise对象的value值
        }).then(function (res) {
         console.log(res);// undefined 由于上一个then里面没有return,所以此次拿不到新建promise的value值
        });

Async

可以执行多个promise

  1. 异步函数返回值为promise对象,同样使用then catch finally
function getName() {
 const promise = new Promise(function (resolve, reject) {
  try {
   setTimeout(resolve, 500, "张三");
  }
  catch (err) {
   reject(err)
  }
 });
 return promise;
}
function getSex(){
 const promise=new Promise(function (resolve,reject){
  try{
   setTimeout(resolve,1000,"男");
  }
  catch(err){
   reject(err)
  }
 });

 return promise;
}
//async  异步函数返回值为promise对象  then   catch  finally
async function getinfo(){
 const name= await getName();
 const sex=await getSex();
 return {
  name:name,
  sex:sex
 };
}

console.log(getinfo());//promise
getinfo().then(function (res){
 console.log(res);
});
  1. 执行顺序:
    等待promise执行完在继续执行
async function times(val,ms){
 await gettime(ms);
 console.log(val);
}
function gettime(ms){
 return new Promise(function (resolve){
 setTimeout(resolve,ms);
 });
 }
 times("输出",1000);//1000秒后输出
  1. await 命令后边必须是promise(可以直接写也可以间接调用函数里返回值为promise)
 async function getlocal(){
const number=await new Promise(function (resolve,reject){
try{
setTimeout(resolve,1000,1);
}
catch(err){
reject(err);
}
})
console.log(number);
return number;
}
getlocal();
  1. 如果await里面有异常(一个或多个),直接将整体放在try中
    如果await后边的promise返回rejected 直接抓异常抓整个await
    如果多个await之间有继发关系(上一次的await值下一次要用) 就让他们一个一个走
    如果他们之间没有关系可以同时触发(设置计时器时间相同)
async function getlocal(){
let number=null;

try{//抓单个异常
number=await new Promise(function (resolve,reject){
   try{
  setTimeout(resolve,1000,"抓单个异常");
      }
  catch(err){
   reject(err);
     }
})
 }
catch(err){
throw err.message;
}
return number;
}
getlocal().then(function (res){
console.log(res);
});
async function getlocal(){
     try{
     let number=await new Promise(function (resolve,reject){
     try{
     setTimeout(resolve,1000,"多个异常1");
     }
     catch(err){
     reject(err);
     }
     })
     let data=await new Promise(function (resolve,reject){
     try{
     setTimeout(resolve,2000,"多个异常2");
     }
     catch(err){
     reject(err);
     }
     })
     return {
     number:number,
     data:data
     };
     }
     catch(err){
     console.log(err);
     }
     }
     getlocal().then(function (res){
     console.log(res);
     });

继发案例:

function getname(){
 return new Promise(function (resolve){
 setTimeout(resolve,1000,"张三");
 })
 }
 function getsex(name){
 return new Promise(function (resolve){
 setTimeout(resolve,1000,"男");
 })
 }
 function getage(age){
 return new Promise(function (resolve){
 setTimeout(resolve,1000,"18");
 })
 }
 async function getinfo(){
 let name=await getname();
 let age=await getage(name);
 let sex=await getage(age);
 return sex;
 }
 getinfo().then(function (res){
 console.log(res);
 });
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值