async和await|青训营笔记

70 阅读2分钟

这几天面试,我知道promise也知道async 但最后人家问我他俩的区别,我就蒙了,这有啥区别,咱也不知道,咱也不敢问,只能下来查了,现在嘛,了解的差不多了,害 边面边学呗,不懂的地方还有很多了

1.promise

ECMAScript 6 新增的引用类型 Promise,可以通过 new 操作符来实例化。创建新期约时需要传入执行器(executor)函数作为参数。

1.用法

promise有三个状态,分别是pending(执行中)、success(成功)、rejected(失败):

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

复制代码

无论 resolve()和 reject()中的哪个被调用,状态转换都不可撤销了。于是继续修改状态会静默 失败,如下所示:

    let p = new Promise((resolve, reject) => {
            resolve(); 
            reject(); // 没有效果 
           });
复制代码

为避免期约卡在待定状态,可以添加一个定时退出功能。比如,可以通过 setTimeout 设置一个 10 秒钟后无论如何都会拒绝期约的回调:

   let p = new Promise((resolve, reject) => { 
           setTimeout(reject, 10000); // 10 秒后调用 reject() // 执行函数的逻辑 
         });
         
           setTimeout(console.log, 0, p); // Promise <pending>
           setTimeout(console.log, 11000, p); // 11 秒后再检查状态
复制代码

2.Promise.prototype.finally()

Promise.prototype.finally()方法用于给期约添加 onFinally 处理程序,这个处理程序在期 约转换为解决或拒绝状态时都会执行。这个方法可以避免 onResolved 和 onRejected 处理程序中出 现冗余代码。但 onFinally 处理程序没有办法知道期约的状态是解决还是拒绝,所以这个方法主要用 于添加清理代码。

3.async await

它可以把一个异步函数强制的处理成为一个同步函数,就很厉害,他本质也是promise,衍生出来的语法糖,写起来更优雅。async和await是配对使用的!!!!这点谨记,少任何一个都会报错

 //不加async await
 function foo () {
   Promise.resolve().then(resolve => {
    console.log("1");
  });
  console.log(3);
}
foo();//3  1
复制代码
 //加了async await
async function foo () {
  await Promise.resolve().then(resolve => {
    console.log("1");
  });
  console.log(3);
}
foo();//1 3
复制代码

3.区别

async/await 是建立在 Promises上的,不能被使用在普通回调以及节点回调

async/await相对于promise来讲,写法更加优雅

async/await 和 Promises 很像,不阻塞

async/await 代码看起来像同步代码

其实把,了解完了之后也没啥大区别,async await就是generator语法糖,可以用generator来模拟async await。