Promise意义:
promise是异步调用的语法糖,其最大优势就是把原来的ajax或httpXmlRequest的嵌套回调调用,转化为链式调用,增强了书写规范和避免地域回调带来弊端。
Promise原理:
在使用promise要注意,promise分为三种状Pending(进行中),Fulfilled(已成功),Rejected(已失败),当执行成功时Pending转化Fulfilled,当执行失败时,Pending转化为Rejected。而且转化不可逆。
Promise实现类分为:状态管理、执行结果、执行成功回调和执行失败回调,其内部实现好比是一个订阅/发布,回调列表通过then注册,由执行状态触发。
Promise可以实现多个订阅者(then),但单个Promise执行状态只有储存一个执行结果,为保证在多个回调中既可以共享执行结果,又可以链式处理结果,形成流水操作,在书写时特别要注意:promise.then方法注册时,会发回一个新的promise对象,即const promise1 = new Promise(cb).then()和const promise1 = new Promise(cb).then().then()不是同一个promise对象。如果共享同一个执行结果写法:
const promise1 = new Promise(cb);
promise1.then(onLisener1);
promise1.then(onLisener2);
这样就可以保证onLisener1,onLisener2入参一致性。
若想链式处理执行结果,且前一个执行结果是后一个入参,则采用const promise1 = new Promise(cb).then(
onLisener1).then(
onLisener2);
Promise:案例
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('promise1');
},5000)
});
promise1.then((val) => {
console.log(val,':promise1.then');
return 'promise1.then';
});
const promise2 = promise1.then((val) => {
// 1、promise1.then首先新建一个新的promise,为后续的链式提供then方法
// 2、根据promise当前状态,执行注册内容调用
console.log(val,':promise1-promise1');
return 'promise1-promise1';
}).then((val) => {
console.log(val,':promise2-2');
return 'promise2-2';
}).then((val) => {
console.log(val,':promise2-3');
return 'promise2-3';
});
promise2.then((val)=> {
console.log(val, 'promise2-xxx');
return 'promise2-xxx';
});
promise1.then((val) => {
console.log(val, ':promise1.then2');
return 'promise1.then2';
});
执行结果:
promise1 :promise1.then
promise1 :promise1-promise1
promise1 :promise1.then2
promise1-promise1 :promise2-2
promise2-2 :promise2-3
promise2-3 promise2-xxx