promise是以同步的形式来执行异步代码的回调函数
let myPromise = new Promise(function (resolve, reject){
setTimeOut(()=> {
resolve(data)或者reject(data)
})
})
.then(onFulfilled, onRejected)
.catch(onRejected)
或
myPromise.then(onFulfilled, onRejected)
myPromise.catch(onRejected)
1. promise 是⼀个有then⽅法的对象或者是函数, ⾏为遵循本规范
2. thenable 是⼀个有then⽅法的对象或者是函数
3. value 是promise状态成功时的值, 也就是resolve的参数, 包括各种合法的值, 包括undefined, thenable, promise, 个人习惯用res标识这个值
4. reason 是promise状态失败时的值, 也就是reject的参数, 表示拒绝的原因, 个人习惯用rej标识这个值
5. exception 是⼀个使⽤throw抛出的异常值
onFulfilled
promise失败的回调必须是一个函数否则它会被忽略不执行
它不能被执行多次
它不能在promise实现之前调用 只能在promise的状态被重置为fulfilled后调用执行
onRejected
promise失败的回调必须是一个函数否则它会被忽略不执行
它不能被执行多次
它不能在promise实现之前调用 只能在promise的状态被重置为rejected后调用执行
Promise存在三种状态
- pendding 待定
- 等待待定的初始状态, 可变更状态
- 可以通过resolve(value)变更为(成功fulfilled)的状态并向下传递一个参数value,
- 可以通过rejece(reason)变更为rejected(失败rejected)的状态同样向下传递一个参数reason
- fulfilled 成功
- promise的最终标识为成功的状态, 此状态以后promise不可再变更.
- 可以通过.then(value=> {的第一个回调获取成功的状态并执行此回调! 且value为resolve传递的value数据})
- resolve的参数value不能为空 否则then接收的value会为undefined
- rejected 失败
- promise的最终标识为失败的状态, 此状态以后promise不可再变更.
- 可以通过.catch(reason => {获取成功的状态并执行此回调! 且reason为rejece传递的reason数据})
- reject的参数reason不能为空 否则catch接收的reason会为undefined
promise的链式方法
- .then()
- 可以接收构造函数中处理的状态变化, 并分别对应执行.
- then方法有2个参数, 第一个函数接收resolved状态的执行,第二个参数接收reject状态的执行.
- then方法的执行结果也会默认返回一个参数为undefined的Promise对象. 因此我们可以进行then的链式执行, 且会将then中return的值作为参数传递如果return为一个新的Promise.resolve()或Promise.reject()则会向下传递一个新的状态和参数
- 第二个参数不会接收第一个个参数中返回的失败的状态执行, 也就是说.then(onFulfilled, onRejected)onFulfilled 和 onRejected只能执行一个
使用方式:
function myPromise (num) {
return new Promise(function (resolve, reject){
if(num <= 0){
resolve('num小于等于0');
} else {
reject('num大于0');
}
})
}
myPromise(0)
.then((res) => {
console.log('1', res); // num小于等于0
return `我来自then1`;
}, (rej) => {
console.log('2', rej);
})
.then((res) => {
console.log('3', res); // 我来自then1
return Promise.reject(`我来自then3`);
}, (rej) => {
console.log('4', rej);
})
.then((res) => {
console.log('5', res);
}, (rej) => {
console.log('6', rej); // 我来自then3
})
- .catch()
- 和then大致相同 相等于.then(null, function(){})
- .finally()
- finally方法用来指定在 promise 结束时, 无论结果是 fulfilled 或者是 rejected, 都会执行的回调函数. 这样可以避免同样的语句需要在then()和catch() 中都要写一次的情况比如去掉加载动画
- finally 方法的回调函数不接受任何参数, 这意味着没有办法知道前面的 Promise状态到底是fulfilled还是rejected
- finally 方法本身无异常抛出的情况下, 会返回原来的 Promise 对象值. 若抛出异常, 则返回异常的 Promise 对象
参考地址: Promises/A+