async和await

一、解释

ES6 = ES2015

ES7= ES2016

 

async和await是ES7出现关键字,目的是彻底解决回调地狱,比Promise彻底。即就是:把异步的回调变成了同步的写法。

据说,async和await是回调地狱的终极解决方案。

 

async:异步

await:等待

 

二、 async定义函数的格式

语法:


 
 
  1. async function 函数名()
  2. {
  3. try{
  4. let res = await 异步操作 (使用 Promise) ; //res: 就是Promise里面resolve函数的参数
  5. console.lor(res);
  6. ​ } catch(err){
  7. ​ err:就是 Promise里面reject函数的参数
  8. ​ }
  9. await 异步操作 (使用 Promise)
  10. ​ }

返回值:Promise对象;

功能:将异步操作按同步操作的方式书写,即上一步未执行完,会阻塞当前函数的进程,不影响主线程

知识点:

1)、async:修饰的函数表示函数里面有异步操作,返回值是Promise对象

2)、await:

2.1)、一般await后跟 promise对象,或者返回Promise对象的函数;

2.2)、await 修饰函数后,那么,返回值变成了Promise对象中resolve的参数;

如 Let res = await fn(); //res是函数fn返回的Promise对象里的resolve的参数。

2.3)、如果要拿到reject里参数,就使用try catch。

如:

try{

Let res = await fn(); //res是 fn函数里Promise的resolve的参数

}catch(err){

err 是 fn函数里Promise的reject的参数

}

 

三、使用async和await:

1、只使用async关键字

 

使用async修饰函数,函数的返回值是Promise对象。函数本身的返回值,会作为resolve的参数;


 
 
  1. async function f2(){
  2. return "hello f2"; //return后面的字符串会作为 resolve函数的参数。
  3. }

 

// 等价于:


 
 
  1. function f2(){
  2. return new Promise( function(resolve,reject){
  3. ​ resolve( "hello f2");
  4. ​ })
  5. }

2、使用async和await结合(获取resolve里的值)

1)、 await只能写在async修饰的函数里。

2)、await是等待的意思,await修饰的代码会等待。在函数里,碰到await修饰的代码时,await朝后的代码都会等待。 等到函数外面的代码执行完毕后,再执行await里的代码。

3)、一般来说:await后面接一个Proimse对象,或者返回Promise对象的函数。

await 修饰函数后,那么,返回值变成了Promise对象中resolve的参数

示例一:


 
 
  1. async function fn() {
  2. console.log( "await前")
  3. // await 修饰的 Promise对象的返回值是 resolve的参数,不用再写then了。
  4. let res = await new Promise( (resolve, reject) => {
  5. ​ setTimeout( function () {
  6. ​ resolve( "hhhh");
  7. ​ }, 1000)
  8. ​ })
  9. console.log( "await后:"+res)
  10. }
  11. fn()
  12. console.log( '虽然在后面,但是我先执行');

示例二:

把以上代码中,await后面的Promise对象写在一个函数里。

 


 
 
  1. function testf(){
  2. return new Promise( (resolve, reject) => {
  3. ​ setTimeout( function () {
  4. ​ resolve( "hhhh");
  5. ​ }, 1000)
  6. ​ })
  7. }
  8. async function fn() {
  9. console.log( "await前")
  10. // await 修饰的 Promise对象的返回值是 resolve的参数,不用再写then了。
  11. let res = await testf();
  12. console.log( "await后:"+res)
  13. }
  14. fn()
  15. console.log( '虽然在后面,但是我先执行');

 

示例三:

再进一步


 
 
  1. function testf(){
  2. return new Promise( (resolve, reject) => {
  3. ​ setTimeout( function () {
  4. ​ resolve( "hhhh");
  5. ​ }, 1000)
  6. ​ })
  7. }
  8. async function fn() {
  9. let res = await testf();
  10. console.log(res)
  11. let res2 = await testf();
  12. console.log(res2)
  13. }
  14. fn()

 

示例四:

发送一个ajax请求:

 


 
 
  1. $( "btnLogin").onclick = function () {
  2. ​ getData()
  3. ​ }
  4. async function getData() {
  5. let sendStr = `username=${$("username").value}&userpass=${$("userpass").value}`;
  6. let res = await ajax03({
  7. ​ method: "post",
  8. ​ url: "loginCheck03.php",
  9. ​ params: sendStr
  10. ​ })
  11. ​ success(res);
  12. ​ }

 

示例五:

发送两个ajax请求,并且后一个请求需要依赖前一个请求的结果:


 
 
  1. async function fn(){
  2. // 1、验证用户名是否存在
  3. let res = await ajax03({
  4. ​ url: "checkUser.php",
  5. ​ params: "username="+oUser.value
  6. ​ });
  7. if(res== "0"){
  8. // 2、用户名如果不存在,则进行注册的ajax请求
  9. let res2 = await ajax03({
  10. ​ method: "post",
  11. ​ url: "regSave.php",
  12. ​ params: `username=${oUser.value}&userpass=${oPass.value}`
  13. ​ });
  14. if(res2== "1"){
  15. ​ $( "messagebox").innerHTML = "注册成功,请<a href='02login.html'>登录</a>";
  16. ​ } else if(str== "0"){
  17. ​ $( "messagebox").innerHTML = "注册失败!";
  18. ​ }
  19. ​ }
  20. }

3、使用async和await结合(获取reject里的值)

使用try catch

格式:

try{

若干句代码;这些代码里,只要碰到错误,就会跳到catch里。即就是:碰到错误后,try里处于错误行后面的代码不再执行。

}catch(){

出错,

}

如:

try{

let res1 = await ajax();

res1就是 resolve的参数

let res2 = await ajax();

res2就是 resolve的参数

}catch(err){

err:如果说第一次ajax请求失败,那么err就是第一次ajax请求里reject的参数;

如果说第二次ajax请求失败,那么err就是第二次ajax请求里reject的参数

}

 

示例一:


 
 
  1. function getFn(){
  2. return new Promise( (resolve, reject) => {
  3. ​ setTimeout( function () {
  4. if( false){
  5. ​ resolve( "hhhh");
  6. ​ } else{
  7. ​ reject( "出错了");
  8. ​ }
  9. ​ }, 1000)
  10. ​ })
  11. ​ }
  12. async function fn() {
  13. console.log( "await前")
  14. try {
  15. let res = await getFn();
  16. console.log( "await后(成功):"+res) //此处拿到的是resolve的参数;
  17. ​ } catch (error) {
  18. console.log( "await后(失败):"+error) //此处拿到的是reject的参数
  19. ​ }
  20. ​ }
  21. ​ fn();

示例二:

发送两个ajax请求,两个ajax请求放在同一个try catch里,那么,哪个出错了,catch里拿到的就是哪个里的reject的参数


 
 
  1. try {
  2. let sendStr = `username=${$("username").value}&userpass=${$("userpass").value}`;
  3. let res = await ajax03({
  4. ​ method: "post",
  5. ​ url: "loginCheck03.php",
  6. ​ params: sendStr
  7. ​ });
  8. ​ success(res);
  9. let res2 = await ajax03({
  10. ​ url: "loadMore.php",
  11. ​ params: "pageIndex=2"
  12. ​ });
  13. ​ show(res2);
  14. ​ } catch (error) {
  15. console.log( "error:", error); //第一次请求出错,那么拿到的就是第一次请求的reject的参数;第二次出错,就是第二次的reject的参数;
  16. ​ }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值