2020-10-22

it2025-09-08  5

promise本身是异步还是同步

首先了解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回调函数 主任务队列>事件队列>消息队列

最新回复(0)