promise是什么
promise是异步编程的新方案
从语法上:promise是一个构造函数。
从功能上:promise封装了一个异步函数并可以返回其结果。
为什么会出现Promise
在JavaScript的世界中,所有代码都是单线程执行的。由于这个缺陷,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。异步执行可以用回调函数实现。而Promise是异步编程的新方案
异步:将耗时很长的A工作交付给系统,然后就去执行B工作,等系统完成前面的工作,就通过回调函数继续完成A工作。AB工作的完成顺序,和交付他们的时间无关,所以叫异步。
纯回调函数和promise对比
指定回调函数的方式更加灵活,常规都是先指定回调
纯回调函数:
回调函数必须在启动异步前指定
createAudio(audioSetting, successCallback, failureCallback)//successCallback,failureCallback必须在启动异步任务之前指定
promise
可以在异步任务启动后才指定回调函数
setTimeout(() => {
p.then(val=> {
console.log(val)
},reason => {
console.log(reason)
})
},3000)
回调地狱的的产生
一个回调函数里面需要上一层回调函数的结果作为参数。这是一种情况
promise支持链式调用,解决回调地狱便于阅读
function ajax(url,methods,data) {
let xhr = new XMLHttpRequest()
return new Promise(function(resolve, reject) {
xhr.onreadystatechange = function () {
if(xhr.readyState === 4) {
if(xhr.status === 200) {
return resolve(xhr.responseText)
}else {
return reject(xhr.status)
}
}
}
xhr.open('get', methods)
xhr.send(data)
})
}
ajax('www.baidu.com','get').then((resolve => {
//成功返回
console.log(resolve)
}).catch(reject => {
//错误返回
console.log(reject)
})
函数对象
当我们把一个函数当对象使用时,他就是函数对象。 Fn.prototype\
错误
所有类型的父类型
Error
引用的变量不存在
ReferenceError
类型错误
TypeError
范围错误
RangeError
语法错误
SyntaxError
错误处理
捕获错误
try…catch
try {
let b;
console.log(b.xxx)
}catch(error) {
console.log(error.message)
console.log(error.stack)
}
抛出错误
throw
\
function D() {
if(new Date % 2 === 1) {
console.log(666)
}else {
throw new Error("当前时间为偶数")
}
}
try {
D()
}catch (e) {
alert(e.message)
}
最基础的结构
// 1.创建一个Promise对象
let p = new Promise((resolve, rejected) => {
setTimeout(() => {
let d = Date.now()
if(d % 2 === 0) {
// 如果成功了执行,调用resolve函数
resolve('d是偶数')
} else {
// 如果失败了执行,调用rejected函数
rejected('d是基数')
}
},1000)
})
p.then((val) => {
console.log(val)
}, reason => {
console.log(reason)
})
promise的异常传透
如果链式then调用,如果前面的then都没有指定回调,等于它们的rejected回调为
reason => {throw reason}
reason => Promise.rejected(reason)
中断promise链
在catch中返回一个状态为pending的Promise对象
.catch(() => {
return new Promise(() => {})
})
方法
Promise.all([p1,p2,p3])
传入几个实例对象,若全部成功则返回全部返回的数据,若有一个失败则返回失败的rejected
Promise.race([p1,p2,p3])
传入几个实例对象,若都成功,则返回先完成的数据,若有一个失败则返回失败的rejected
p1.then(resolve, rejected)
不管是成功的回调还是失败的回调都是异步的
改变状态
抛出异常也可以改变状态为rejected
throw new Error()