VueMastery
![VueMastery](https://sponsors.vuejs.org/images/vuemastery.avif)
异步编程:
- fs文件操作
- 数据库操作
- ajax
- 定时器
- ...
fulfilled
rejected
说明:只有这三种,且一个 promise 对象只能改变一次,无论变为成功还是失败,都会有一个结果数据,成功的结果数据一般称为
value
,失败的结果数据一般称为reason
。
const btn = document.getElementById('btn')
btn.addEventListener('click', () => {
const p = new Promise((resolve, reject) => {
// 1.创建对象
const xhr = new XMLHttpRequest()
// 2.初始化
xhr.open('GET', 'https://api.apiopen.top/getJoke')
// 3.发起请求
xhr.send()
// 4.监听响应事件
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
// 判断响应状态码
if (xhr.status >= 200 && xhr.status < 300) {
// 控制台输出响应体
// console.log(xhr.response)
resolve(xhr.response)
} else {
// 控制台输出响应状态码
// console.log(xhr.status)
reject(xhr.status)
}
}
}
})
p.then((value) => {
console.log(value)
}, (reason) => {
console.log(reason)
})
})
Promised 构造函数
:Promise(executor) {}
executor函数
:执行器,(resolve, reject) => {}resolve 函数
:内部定义成功时我们调用的函数 value => {}reject 函数
:内部定义失败时我们调用的函数 reason => {}executor执行器
会在Promise内部立即同步调用
,异步操作在执行器中执行
。Promise.prototype.then
方法:(onResolved, onRejected) => {}
onResolved 函数
:成功的回调函数 (value) => {}onRejected 函数
:失败的回调函数 (reason) => {}Promise.prototype.catch
方法:(onRejected) => {}
onRejected 函数
:失败的回调函数 (reason) => {}Promise.resolve
方法:() => {}
// 如果传入的参数为 非Promise类型的对象,则返回的结果为成功的promise对象
const p1 = Promise.resolve(521)
console.log(p1)
// 如果传入的参数为 Promise对象,则参数的结果决定了 resolve 的结果
const p2 = Promise.resolve(new Promise((resolve, reject) => {
// 如果参数为 Promise 对象,则外面的resolve的状态由里面的Promise对象的状态决定
// resolve(520) // 里面的Promise对象状态因为调用了 resolve,里面的状态变成了 'fulfilled'
reject('失败的结果') // 里面的Promise对象状态因为调用了 reject,里面的状态变成了 'rejected'
}))
p2.then((value) => {
console.log(value)
}, (reason) => {
console.log(reason)
})
Promise.reject
方法:() => {}
reason:失败的原因
说明:返回一个失败的 promise 对象
// 与 Promise.resolve 方法相反,不管传入的是什么,最终返回的 Promise 对象的状态永远都是失败的,失败的结果为传入的对象(Promise对象/非Promise对象)
const p1 = Promise.reject(Promise.resolve(521))
p1.catch(err => {
console.log(err)
})
Promise.all
方法:(promises) => {}
promises:包含n个 promise 的数组
说明:返回一个新的 promise,只有当所有的promise都成功才成功,只要有一个失败了就直接失败。
Promise.all(promises) {} 接收一个存放promise对象的数组,只有数组中的所有promise对象的状态都为'成功'时,返回的promise对象的状态才为'成功',返回promise对象的结果为所有promise对象的结果所组成的数组
只要数组中有一个promise对象的状态为'失败',返回的promise对象的状态就为'失败',返回的promise对象的结果为失败的promise对象的结果
// Promise.all(promises) {} 接收一个存放promise对象的数组,只有数组中的所有promise对象的状态都为'成功'时,返回的promise对象的状态才为'成功',返回promise对象的结果为所有promise对象的结果所组成的数组
const p1 = Promise.resolve('success01')
const p2 = Promise.resolve('success02')
const p3 = Promise.all([p1, p2])
/*p3.then((value) => {
console.log(value)
}, (reason) => {
console.log(reason)
})*/
// 只要数组中有一个promise对象的状态为'失败',返回的promise对象的状态就为'失败',返回的promise对象的结果为失败的promise对象的结果
console.log('---------------------------------分割线---------------------------------')
const p4 = Promise.reject('all方法失败演示') // 失败了,没有then的第二个方法onRejected或catch来处理,会有报错信息,不要惊讶
const p5 = Promise.all([p1, p2, p4])
console.log(p5)
Promise.race
方法:(promises) => {} Promise.race(promises) 方法接收一个由 promise对象 组成的数组,返回一个promise对象。返回的promise对象的状态由最先执行的promise对象的状态决定,结果为最先执行的 promise 对象的结果。
// Promise.race(promises) 方法接收一个由 promise对象 组成的数组,返回一个promise对象。返回的promise对象的状态由最先执行的promise对象的状态决定,结果为最先执行的 promise 对象的结果。
const p1 = new Promise((resolve, reject) => {
reject('First Result.') // 让 promise 对象的状态为失败
// resolve("First Result.") // 让 promise 对象的状态为成功
/*setTimeout(() => {
reject(521)
}, 1000)*/ // 异步任务
})
const p2 = Promise.resolve("Second Result.")
const p3 = Promise.resolve("Third Result.")
const result = Promise.race([p1, p2, p3])
console.log(result) // 状态: fulfiiled, 结果:First Result.
如何改变promise的状态?
resolve(value)
:如果当前是 pending
就会变为fulfilled
。reject(reason)
:如果当前是pending
就会变为rejected
。pending
就会变为rejected
。一个promise指定多个成功/失败回调函数,都会调用吗?
都会调用
改变promise状态和指定回调函数谁先谁后?
promise.then()返回的新promise的结果状态由什么决定?
rejected
,reason
为抛出的异常。非promise
的任意值,新promise变为fulfilled
,value为返回的值。const p1 = new Promise((resolve, reject) => {
resolve('OK')
})
// promise.then()返回的新promise对象的结果由then所执行的回调函数的结果决定
const result = p1.then((value) => {
console.log(value)
// 1.抛出异常
// throw '出错啦!!!'
// 2.返回非promise对象的结果: 比如数字、字符串等
// return "521"
// 3.返回一个新的promise对象 -> then返回的promise对象的状态和结果由新的promise对象的状态和结果决定
return new Promise((resolve, reject) => {
// resolve('123') // then返回的promise对象的状态为成功
reject(789) // then返回的promise对象的状态为失败
})
}, (reason) => {
console.log(reason)
})
console.log("result: ", result)
promise如何串联多个操作任务?
then()
返回一个新promise,可以变成then()的链式调用。then
的链式调用串连多个同步/异步任务。promise异常穿透是怎么回事?
中断promise链是怎么回事?
pending
状态的promise对象