写在前面:javascript
在学习微信小程序过程当中了解到利用Promise,能够对事件请求的回调进行优化,避免了多重回调形成的"回调地狱"问题,本文主要用做介绍及记录在使用Promise过程当中遇到的问题和思考。html
Promise 是一个对象,至关于一个容器,里面存的是一个异步操做的结果,而且表明一个将来可能会完成的操做。java
Promise的三种状态:web
Promise的两种状态改变的方式:ajax
当异步操做成功时,从pending转变为resolved,小程序
当异步操做失败时,从pending转变为rejected。segmentfault
PS.一旦状态改变,就会一直保持这个状态,不会再发生变化。当状态发生变化,promise.then绑定的函数就会被调用。微信小程序
Promise一旦新建就会「当即执行」(它属于microtask),没法取消。这也是它的缺点之一。promise
套路通常为:微信
定义一个函数, 函数内部使用new Promise()的方式来返回一个promise对象,resolve用来保存异步处理成功的结果,reject用来保存异常处理的结果。
而后函数调用,传参。
用then方法处理链式调用, then中的回调用来处理异步结果。
用catch方法处理错误状况,,也能够用then(null, function() {})代替catch。
then的回调中也可return一个值,会被包装成一个新的promise对象, 以此能够继续调用then方法。
处理同步任务
new Promise((resolve,reject)=>{
resolve(1);
})
.then(res=>{
console.log(res);
});
复制代码
输出结果:
1
Ps.当状态发生变化后执行then方法,并将resolve或reject的结果做为then方法接受回调函数的参数
复制代码
处理异步任务
new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve("成功");
},1000);
})
.then(res=>{
console.log(res);
});
复制代码
输出结果:
成功
Ps.当异步代码执行成功时,会调用resolve(...), 当异步代码失败时就会调用reject(...)
复制代码
处理链式调用
new Promise((resolve, reject) => {
console.log('初始化');
resolve();
})
.then(() => {
throw new Error('有哪里不对了');
console.log('执行「这个」”');
})
.catch(() => {
console.log('执行「那个」');
})
.then(() => {
console.log('执行「这个」,不管前面发生了什么');
});
复制代码
输出结果:
初始化
执行“那个”
执行“这个”,不管前面发生了什么
Ps.由于抛出了错误‘有哪里不对了’,因此前一个‘执行「这个」’没有被输出
复制代码
[1].MDN web docs-developer.mozilla.org/zh-CN/docs/…
[2].AustinNorman:Promise的学习总结-www.ctolib.com/topics-1388…
[3].cz160:利用ES6进行Promise封装总结-segmentfault.com/a/119000001…
[4].砖用西瓜:Promise到底解决了什么问题-segmentfault.com/a/119000001…