所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
Promise 是一个对象,从它可以获取异步操作的消息。
function promise () {
new Promise(() => {
setTimeout(() => {
console.log(100)
}, 5000)
})
console.log(0)
}
promise() // 这种一般是回调函数
console.log(1)
// 0 1 100
因此,在上述代码中,当 promise() 方法被调用且离开函数进入下一步操作的时候,内部的 promise 其实还没完成
对上述代码进行改进
function promise () {
return new promise(() => {
setTimeout(() => {
console.log(100)
}, 5000)
})
}
promise() // 这种一般是回调函数
在上述代码中,当 promise() 方法被调用且完成的时候,也就是 promise 新建完成的时候,也就是异步操作完成的时候,那么就可以实现 then() 的链方法
如果then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例),可以采用链式写法
Promise 的三种状态
pending(进行中)、fulfilled(已成功)和rejected(已失败)。Promise对象代表一个异步操作,只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
promise() 也可以包含非异步的操作,也同样可以resolve,reject. 但没什么意义
相关知识点:
如下代码,请问能捕获到异常吗?
try {
new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('sb'))
}, 5000)
})
}
catch (err) {
console.log(err)
}
答案:不能,因为try {} catch {} 只能捕获同步代码错误
改进方法:
用 async 与 await 将其变为同步代码
async function catchErr () {
try {
await new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('sb'))
}, 5000)
})
}
catch (err) {
console.log(err)
}