面试官:谈谈你对异步回调、promise、async/await的理解?

时间:2021-6-4 作者:qvyue

promise的用法

Promise,简单来说就是一个容器,里面保存着某个未来才会结束的时间(通常是一个异步操作的结果)
Promise构造函数接收一个函数作为参数,该函数的两个参数是resolve,reject,它们由JavaScript引擎提供。其中resolve函数的作用是当Promise对象转移到成功,调用resolve并将操作结果作为其参数传递出去;
reject函数的作用是单Promise对象的状态变为失败时,将操作报出的错误作为其参数传递出去。

 let p = new Promise((resolve,reject) => {
     resolve('success')
 });

Promise的then方法

promise的then方法带有以下三个参数:成功回调,失败回调,前进回调,一般情况下只需要实现第一个,后面是可选的。Promise中最为重要的是状态,通过then的状态传递可以实现回调函数链式操作的实现

 let p = new Promise((resolve,reject) => {
     resolve('success')
})
    
p.then(result => {
    console.log(result);
    //success
});

Promise的其他方法

catch用法

function myPromise(res){
  return new Promise((resolve,reject)=>{
      if(res.data){
          resolve("成功数据");
      }else{
          reject("失败数据");
      }
  });
}

myPromise().then((message)=>{
    console.log(message);
  }
 )
.catch((message)=>{
    console.log(message);
})

这个时候catch执行的是和reject一样的,也就是说如果Promise的状态变为reject时,会被catch捕捉到,不过需要特别注意的是如果前面设置了reject方法的回调函数,·则catch不会捕捉到状态变为reject的情况。catch还有一点不同的是,如果在resolve或者reject发生错误的时候,会被catch捕捉到,这样就能避免程序卡死在回调函数中了。

all用法

romise的all方法提供了并行执行异步操作的能力,在all中所有异步操作结束后才执行回调。

function p1(){
    return new Promise((resolve,reject)=>{
        resolve("p1完成");
    })
}

function p2(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
           resolve("p2完成")
        },2000);
    })
}

function p3(){
    return new Promise((resolve,reject)=>{
        resolve("p3完成")
    });;
}

Promise.all([p1(),p2(),p3()])
.then((data)=>{
    console.log(data);
})

这里可以看到p2的resolve放到一个setTimeout中,最后的.then也会等到所有Promise完成状态的改变后才执行。

race用法

在all中的回调函数中,等到所有的Promise都执行完,再来执行回调函数,race则不同它等到第一个Promise改变状态就开始执行回调函数。将上面的all改为race,得到

Promise.race([p1(),p2(),p3()])
.then(function(data){
    console.log(data);
})

async、await

异步编程的最高境界就是不关心它是否是异步。async、await很好的解决了这一点,将异步强行转换为同步处理。async/await与promise不存在谁代替谁的说法,因为async/await是寄生于Promise,是Generater的语法糖。

用法

async用于申明一个function是异步的,而await可以认为是async wait的简写,等待一个异步方法执行完成。规则:
1 async和await是配对使用的,await存在于async的内部。否则会报错
2 await表示在这里等待一个promise返回,再接下来执行
3 await后面跟着的应该是一个promise对象,(也可以不是,如果不是接下来也没什么意义了…)

写法:

async function demo() {
 let result01 = await sleep(100);
 //上一个await执行之后才会执行下一句
 let result02 = await sleep(result01 + 100);
 let result03 = await sleep(result02 + 100);
 // console.log(result03);
  return result03;
}
demo().then(result => {
    console.log(result);
});`

错误捕获

let p = new Promise((resolve,reject) => {
    setTimeout(() => {
        reject('error');
    },1000);
});

async function demo(params) {
    try {
        let result = await p;
    }catch(e) {
       console.log(e);
    }
}

demo();

区别:

  1. promise是ES6,async/await是ES7
  2. async/await相对于promise来讲,写法更加优雅
  3. reject状态:
  • promise错误可以通过catch来捕捉,建议尾部捕获错误,
  • async/await既可以用.then又可以用try-catch捕捉
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。