首先了解promise概念:
promise是一个对象,对象和函数的区别是对象可以保存状态,函数不行(闭包除外)将异步操作队列化,使它按照期望有序的进行,返回符合预期的结果不会剥离return能力,因此无需层层传递callback,进行回调获得数据 let p=new Promise(){fucntion((resolve,reject)=>{//Promise构造函数必须传递一个参数(函数参数handle) console.log(star); resolve('ok')//成功返回参数 reject('err')//失败返回的数据 }} .then(data=>{console.log(data)}) .catch(err=>{console.log(err)})Promise有三种状态
pendind:初始状态,待定fulfilled:成功状态,实现reject:失败状态,未实现resovel函数(参数):改变Promise对象的状态,pending->fulfilled,异步执行成功时调用,将异步操作的结果作为参数传递出去
reject函数(参数):改变Promise对象的状态,pending->reject,异步操作失败是时调用,将异步操作报出的错误作为参数传递出去
Promise本身为同步(如下代码)
console.log('a') let p = new Promise((resolve, reject )=> { console.log('b'); resolve(); }) console.log('c') let q = new Promise((resolve, reject) => { console.log('d'); resolve(); }) p.then((data => { console.log('1'); })) q.then((data => { console.log('2'); })) console.log('e'); //a b c d e 1 2在语义上promise是个能够保存状态的对象,其实promise本质是一个构造函数,它只是处理异步操作而已,本身是个同队任务,而里面处理的事件为异步。异步任务处理的结果会通过回调函数的形式得到结果,即通过then(),catch()方法,这个两个方法其实在job queue(任务队列)中。当异步操作执行成功后,promise状态变为fulfilled,此时resolve回调函数加入任务队列中,等到主任务队列执行完后,再到job queue中拿出resolve回调函数执行
下面补充下job queue js事件循环中的消息队列(message queque),事件队列(job queque) 消息队列主要是settimeout()回调函数,事件监听函数回调函数,一些异步任务 事件队列主要是then(),catch(),是es6提出来执行promise回调函数 主任务队列>事件队列>消息队列