- promise是什么
主要用于异步计算
可以将异步操作队列化,按照期望的顺序执行
可以在对象之间传递和操作promise,帮助处理队列
- 异步产生的原因
- 回调函数的问题
- 嵌套很深,难以维护
- 无法正常使用return和throw
- 无法正常检查堆栈信息
- 多个回调之间难以建立联系
- promise详解
new Promise(
//执行器
function(resolve, reject) {
//一段耗时很长的异步操作
if (true/* 异步操作成功 */){
resolve(value);//数据处理完成
} else {
reject(error);//数据处理出错
}
}
).then(function a(){
//成功 下一步
},function b(){
//失败 做相应的处理
})- promise是一个代理对象,他和原先要进行的操作无关
- 他通过引入一个回调,避免更多的回调
promise三个状态:
pending待定,fulfilled实现,rejected被否决
promise状态改变就会触发.then()里的响应函数
promise已经改变,不会再变
- 一个简单的实例
const p1 = new Promise(function (resolve, reject) {
setTimeout(() => resolve('hell'), 2000)
}).then(
value => {
console.log(value+'执行完成');
}
)
console.log('开始')
可以看到当在等待的过程中,还在往下走,然后执行完成延时后再打印出来
- 对已完成的promise执行then
let promise=new Promise(resolve=>{
setTimeout(() => {
console.log('the promise fillfuled');
resolve('hello world')
}, 1000);
})
promise.then(value=>{
console.log(value+' then')
})
promise最为重要的一个特性:在任何地方生成了一个peomise队列之后可以把它作为一个变量传递到其他的地方,不管前面的队列是否完成,都会按照特定的顺序执行。
- then里不返回promise
new Promise(resolve=>{
resolve('100')
}).then(value=>{
console.log(value)
//return false;
}).then(value=>{
console.log(value);
})
在promise里如果不返回一个默认的promise实例,就会直接执行下一个环节
- then的嵌套
- 错误处理
new Promise(resolve=>{
throw new Error('错误')
}).then(value=>{
console.log(value)
}).catch(err=>{
console.log(err);
})
当执行器里抛出错误,就不会执行then,会被catch所捕获
- 错误和then连用
- promise.all
当所有子promise执行完成之后,promise才算完成,并且返回一个数组,数组里的值是所有的子promise值的集合。
当有一个子promise出错了,promise的错误就是它第一个子promise失败的结果
Promise.all([1,2,3])
.then(all=>{
console.log(all);
let p1=new Promise(resolve=>{ //会等待
setTimeout(()=>{
resolve('hjdfg')
},3000);
});
return Promise.all([p1]);
})
.then(all=>{
console.log(all);
let p1=new Promise(null,reject=>{
setTimeout(()=>{
reject('i m p2')
},1000)
})
return Promise.all([p1]);
})
.then(all=>{
console.log(all)
},err=>{ //错误
console.log("err:"+err)
})
.catch(err=>{
console.log("err:"+err)
})