promise 、async await

66 阅读1分钟

一、promise

ECMAScript 6 新增的引用类型 Promise,可以通过 new 操作符来实例化。创建新期约时需要传入执行器(executor)函数作为参数。 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 秒后再检查状态

二、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 代码看起来像同步代码