美文网首页
Promise详解,和await

Promise详解,和await

作者: IceCover | 来源:发表于2019-05-05 17:32 被阅读0次

Promise 知识

常用法:

let pro = new Promise((resolve,reject)=>{
 ...
  resolve('OK');
 ...
  //reject('not OK');
})
pro.then(()=>{    }),catch(()=>{      });

thencatch都会返回Promise,他们因此可以被链式调用
其实等同于

pro.then( ()=>{    }, ()=>{      } );

then最多可以跟两个参数,第一个其实是resolve,第二个是reject
then还可以被多次调用,可以前面返回return后面跟着用

pro.then(val=>{
    retrun val+1;  
  }).then(val=>{
    console.log(val);    //打出的值是 结果+1;
})

或者这样

Promise.resolve('OK').then(val=>{
  val   //  val  : OK
});

Promise的标准有7个。
resolve,reject,all,race,finally,done,
但是后两个兼容性不好,没有被广泛支持,只有最新的chrome有这个。
finally不论结果是resolve,或者reject都至都执行 类似$ajax的always

Promise.prototype.finally = function (callback){
  let P = this.constructor;
  return this.then(
  value => P.resolve(callback()).then(() =>  value),    //这个callback是加了(),直接执行 而不是传的是函数的参数
  reason => P.resolve(callback()).then(() => {   throw reason })
);
};

done Promise对象的回调链,不管以then方法或catch方法结尾,要是最后一个方法抛出错误,都有可能无法捕捉到(因为 Promise 内部的错误不会冒泡到全局)。因此,我们可以提供一个done方法,总是处于回调链的尾端,保证抛出任何可能出现的错误。(或者说done是最后执行的Promise链)

Promise.prototype.done = function (onFulfilled, onRejected) {
  this.then(onFulfilled, onRejected)
  .catch(function (reason) {// 抛出一个全局错误
  setTimeout(() => { throw reason }, 0);
  });
};

all,race可以传多个Promise

Promise.all([p1, p2]).then((result) => {
    console.log(result)               //['p1的返回', 'p2的返回']
  }).catch((error) => {
  console.log(error)
})

racethen,catch返回最快返回的那个

asyncawait 知识

官方解释:

await 表达式会暂停当前 async function 的执行,等待 Promise 处理完成。若 Promise 正常处理(fulfilled),其回调的resolve函数参数作为 await 表达式的值,继续执行async function。若 Promise 处理异常(rejected),await 表达式会把 Promise 的异常原因抛出。另外,如果 await 操作符后的表达式的值不是一个 Promise,则返回该值本身。

这样更容易理解:

async 函数返回一个 Promise 对象,当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。

say = ()=>{
     return new Promise((resolve, reject)=> {
           setTimeout(()=> {
               resolve(`test`);
             },3000);
        });
    }

    async function demo () {
        const v = await say(); // 如果成功, 会把回调 resolve函数的参数作为结果
      //只有resolve才有返回
    console.log('hahahahah')
        console.log(v);
    }
demo();

相关文章

网友评论

      本文标题:Promise详解,和await

      本文链接:https://www.haomeiwen.com/subject/eaphoqtx.html