实例网站制作教程,疗养院有必要做网站吗,企业展厅设计公司图片,丹阳网站怎么做seo实现 Promise.prototype.finally 前面的promise不管成功还是失败#xff0c;都会走到finally中#xff0c;并且finally之后#xff0c;还可以继续then#xff08;说明它还是一个then方法是关键#xff09;#xff0c;并且会将初始的promise值原封不动的传递给后面的then.…实现 Promise.prototype.finally 前面的promise不管成功还是失败都会走到finally中并且finally之后还可以继续then说明它还是一个then方法是关键并且会将初始的promise值原封不动的传递给后面的then. Promise.prototype.finally最大的作用
finally里的函数无论如何都会执行并会把前面的值原封不动传递给下一个then方法中
如果finally函数中有promise等异步任务会等它们全部执行完毕再结合之前的成功与否状态返回值
Promise.prototype.finally六大情况用法
// 情况1
Promise.resolve(123).finally((data) { // 这里传入的函数无论如何都会执行console.log(data); // undefined
})// 情况2 (这里finally方法相当于做了中间处理起一个过渡的作用)
Promise.resolve(123).finally((data) {console.log(data); // undefined
}).then(data {console.log(data); // 123
})// 情况3 (这里只要reject都会走到下一个then的err中)
Promise.reject(123).finally((data) {console.log(data); // undefined
}).then(data {console.log(data);
}, err {console.log(err, err); // 123 err
})// 情况4 (一开始就成功之后会等待finally里的promise执行完毕后再把前面的data传递到下一个then中)
Promise.resolve(123).finally((data) {console.log(data); // undefinedreturn new Promise((resolve, reject) {setTimeout(() {resolve(ok);}, 3000)})
}).then(data {console.log(data, success); // 123 success
}, err {console.log(err, err);
})// 情况5 (虽然一开始成功但是只要finally函数中的promise失败了就会把其失败的值传递到下一个then的err中)
Promise.resolve(123).finally((data) {console.log(data); // undefinedreturn new Promise((resolve, reject) {setTimeout(() {reject(rejected);}, 3000)})
}).then(data {console.log(data, success);
}, err {console.log(err, err); // rejected err
})// 情况6 (虽然一开始失败但是也要等finally中的promise执行完才能把一开始的err传递到err的回调中)
Promise.reject(123).finally((data) {console.log(data); // undefinedreturn new Promise((resolve, reject) {setTimeout(() {resolve(resolve);}, 3000)})
}).then(data {console.log(data, success);
}, err {console.log(err, err); // 123 err
})源码实现
Promise.prototype.finally function (callback) {return this.then((data) {// 让函数执行 内部会调用方法如果方法是promise需要等待它完成// 如果当前promise执行时失败了会把err传递到err的回调函数中return Promise.resolve(callback()).then(() data); // data 上一个promise的成功态}, err {return Promise.resolve(callback()).then(() {throw err; // 把之前的失败的err抛出去});})
}