首先来讲下同步异步与阻塞非阻塞的概念,同步异步与阻塞非阻塞并无关系。同步异步主要是事情作完之后,如何进行处理、或者说关注的是一种消息通讯机制。
同步的状况下,是由处理消息者本身去等待消息是否被触发;
而异步的状况下是由触发机制来通知处理消息者数组
举例:
因此同步异步能够说是对被请求方来讲的,被请求者使用什么方式来告知处理结果promise
阻塞非阻塞,主要是对于请求者而言的dom
上代码:异步
/**当咱们new Promise会获得一个Promise对象,该对象会有一个任务要完成,同时该对象会维护一个状态 PromiseStatus 1:pending:正在处理 2:resolved:已完成 3:rejected:失败*/ let p1 = new Promise(function(resolve,reject){ /**要作的事情经过一个函数来完成,该函数会接收两个值 resolve reject 这两个参数都是一个函数,当咱们调用他们的时候,会改变当前任务的状态 resolve() => resolved reject() => rejected */ setTimeout(() => { var a = Math.random(); if(a < 0.5){ console.log(a,'p1失败') reject(a) }else{ console.log(a,'p1成功') resolve(a) } },1000) }) /**Promise对象还有一个then方法,当前任务成功的时候,会调用该方法,并执行该方法传入函数参数 then方法接收两个参数,它们都是函数 第一个参数是当前状态为resolved时候执行 第二个参数是当前状态为rejected时候执行*/ p1.then(a => { console.log('成功',a) },a => { console.log('失败',a) }) /**虽然then方法中的参数接收两个 一个是成功的callback 一个是失败的callback 可是,在书写的时候,若是每个then都传这两个callback的话,编写过程太麻烦,为了可以统一的处理失败Pormise对象又提供了一个新的方法:catch,catch方法也接收一个callback 只要有一个Promise的状态变成了rejected,那么就会被catch方法捕获,执行catch的callback*/ .then((a) => { return new Promise((resolve,reject) => { setTimeout(() => { a *= a; console.log(a,'p1成功') reject(a); },1000) }) }).then((a) => { console.log(a,'p1的then里成功') }).catch((a) => { console.log(a,'失败捕获') })
看打印出来的结果:
当p1中的随机数a < 0.5时,就直接进入catch里捕获到失败了,后面的then都不会执行函数
当p1中的随机数a > 0.5时,就进入到第一个then里,第一个then里又有一个promise对象,可是执行的是reject函数,因此就会直接到catch里捕获到失败code
情形:在一个Promise任务中须要处理多个异步任务,这多个的异步任务是同时进行的,可是执行时间是不肯定的,后续的任务须要这几个异步任务所有完成以后在执行,这时候就须要用到Promise里面提供的all方法来实现orm
var p1 = new Promise((resolve,reject) => { let a = 1; setTimeout(() => { a++; resolve(a); },Math.random() * 1000) }) var p2 = new Promise((resolve,reject) => { let b = 2; setTimeout(() => { b++; resolve(b); },Math.random() * 1000) }) /**把两个不一样的异步任务分别包装在一个Promise对象里,而后调用Promise对象静态方法all,把上面多个不一样异步Promise做为数组传递给all方法的参数,当多个异步任务的状态都变成resolve,那么all的状态才是resolved,可是只要有一个异步任务的状态变成了rejected,那么all的状态就会变成rejected*/ Promise.all([p1,p2]).then(([a,b]) => { console.log(a,b) }).catch((err) => { console.log(err) })
打印台:对象
over~blog