1、异步编程的一种解决方案;
2、以往异步编程的弊端:
- 回调地狱:异步编程中的回调函数里又是多层回调函数;回调数据再进行操作,代码会比较乱,不利于维护、查看;
3、promise解决回调地狱:构造函数执行;嵌套的回调函数通过return
使用new Promise()
;
resolve
与then
对应;reject
与catch
对应;- 也可以直接使用
then(resolve,reject)
实现这两种效果;
new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve()//当我们主动调用then()时用,一般发请求不用写
},1000)
}).then(()=>{
console.log('hello')
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve();//reject('err data')
},1000)
})
}).then(()=>{
console.log('js')
}).catch(err=>{})
4、Promise的三种状态:
5、Promise的写法–链式调用
- 常规写法:
new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('aaa');
reject('sss');
},1000)
}).then(data=>{}).catch(err=>{})
- 简化版
new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('aaa');
reject('sss');
},1000)
}).then(data=>{},err=>{})
- 当内部回调函数只是为了处理上级数据,不是异步操作时,可以简化;
- 当请求返回正确时:
new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('11');
},1000)
})
.then((data)=>{return new Promise((resolve)=>{resolve(data+'aaa')})}).then();
.then((data)=>{return Promise.resolve(data+'aaa')}).then();
.then((data)=>{return data+'aaa'}).then();
- 当请求返回错误时:
new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('11');
},1000)
})
.then((data)=>{return new Promise((reject)=>{reject('err')})}).catch(err=>{});
.then((data)=>{return Promise.reject('err')}).catch();
.then((data)=>{throw 'err'}).catch();
6、Promise处理多个请求:
- 当需要接收多个请求数据后再执行回调函数时使用:
Promise.all([可遍历/可迭代=数组]).then(results=>{})
Promise.all([
new Promise(()=>{}),
new Promise(()=>{})
]).then(results=>{
console.log(results);
});