首先,前端的网络请求需要用这种方式
大家自己写或者调用别人的,需要重写或看源码等导致开发成本过大,ECMA做了统一,于是就有了promise;
出现了promise,只要给调用者返回promise即可,调用者根据promise的状态自己做处理即可;
跟调用者说:我先给你一个承诺即promise,你先去处理其他mainScript,一会就会请求成功后我会调用resolve(data),然后根据规范promise.then()也会被联动调用,这个时候你便可以再promise.then()里接收到数据;
做了统一,方便开发;
1.执行器executor
就是new Promise里的回调函数;
2.resolve传不同值的区别
注意,调用resolve()后会执行then方法的第一个回调函数,这是规定,这些都是ecma的规定,不要问为什么,规定就是这样,v8引擎也就是这样实现的。
1.同一个pormise可以添加多个then方法,然后resolve()时,这多个then方法会同时被调用
2.then方法也会返回一个promise,所以可以链式调用
(1)如果返回一个普通的值(数字/字符串/普通对象/undefined):那么会被包裹到一个新的promise里继续返回,并且这个值作为这个新promise里resolve()方法的参数;
promise.then( (res)=>{ return 'aaaa'; }) 等价于: promise.then( (res)=>{ return new Promise((resolve,reject)=>{ resolve('aaa'); } })
(2)如果返回一个promise,那么这个promise也会被包裹,并且返回的promise的状态,会决定then()方法返回promise的状态;
不明白的话,可以看看上一章中resolve传不同值的状态;
promise.then( (res)=>{ return new Promise((resolve,reject)=>{ resolve(1111); } }) 等价于: promise.then( (res)=>{ return new Promise((resolve,reject)=>{ resolve( new Promise((resolve,reject)=>{ resolve(1111); }); } })
(3)如果返回一个对象,并且这个对象实现了then方法接口
promise.then( (res)=>{ return { then: ()=> resolve(11111) } }) 等价于: promise.then( (res)=>{ return new Promise((resolve,reject)=>{ resolve( obj.then()); } })
3.then()方法可以传递两个参数,第一个参数时resolve()执行的,第二个参数时reject()执行的;
但是现在一般都是只写一个参数,第二个参数不写,rejected要执行的回调放在catch方法中;
感觉很像数组的every方法,都要满足时才为true;
res是一个数组,数组里是所有的promise的返回值,数组元素的顺序就是all()方法里参数的顺序;
all方法类似every,那么any方法就类似some方法,只要有一个就为true;