promise是js编程中进行异步编程新的解决方案(旧的是用纯回调实现的)
从语法上说:promise是一个构造函数
从功能上说:promise对象用来封装一个异步操作并可以获取其结果
错误对象:Error,所欲错误类型的父类
常见的内置错误
ReferenceError:引用的变量不存在
console.log(a) //ReferenceError:a is noe defined
TypeError:数据类型不正确的错误
let b = null
console.log(b.xx) //TypeError:cannot read property 'xx' of undefined
RangeError:数据值不在其所允许的范围内
function fn(){
fn()
}
fn() //RangeError:Maximum call stack size excees
SyntaxError:语法错误
错误处理
捕获错误:try...catch
try{
let b;
console.log(b.xx)
}catch(error){
console.log(error.message)//出错信息
console.log(error.stack)//显示的更多
}
console.log('出错后继续向下执行')
抛出错误:throw error
function something(){
if(Data.now()%2===1){
console.log('当前时间为奇数,可以执行任务')
}else{//抛出异常,由调用者处理
throw new Error('当前的时间为偶数')
}
}
promise的状态改变
1.pending变为resolve
2.pending变为rejected
说明:只用这两种,且一个promise对象只能改变一次
无论是成功还是失败,都会有一个结果数据
成功的结果数据一般为value,失败的数据一般为reason
Promise 的基本使用
创建Promise对象
//1.创建一个新的Promise对象
const p = new Promise((resolve,reject)=>{ //执行器函数
//2.执行异步操作任务
setTimeout(()=>{
const time = Date.now()//如果当前时间时偶数表示成功,否则失败
//3.1成功了调用resolve(value)
if(time %2 ==0){
resolve('成功的数据,time'+time)
}else{
//3.2失败了调用个reject(reason)
reject('失败的数据,time'+time)
}
},1000)
})
p.then(
value =>{//得到成功的数据value onResolve
console.log('成功的回调',value)
},
reason =>{//得到失败的回调reason onReject
console.log('失败的回调',reason)
}
)
promise解决的问题
1.指定回调的方式更加灵活:
旧的:必须在启动异步任务之前指定回调函数;
promise:启动异步任务=>返回promise对象=> 给promise对象绑定回调函数
2.支持链式调用,可以解决回调地狱的问题
什么是回调地狱? 回调函数嵌套调用,外部函数异步执行的结果是内部嵌套的回调函数的执行条件
回调地狱的缺点: 不便于阅读,不便于异常处理
解决方案?promise链式调用
终极解决方案? async/await