后面的then方法就是在为上一个then返回的Promise注册回调前面的then方法中的回调函数的返回值回作为后面then方法回调的参数如果回调中返回的是Promise, 那后面的then方法的回调会等待他的结束捕获异常
onRejected 回调会在
Promise执行异常或者抛出的异常时触发 , 捕获异常有两种方式 , 第一种,
then(成功处理的回调函数, 异常处理的回调函数) 在
then方法中传递两个回调函数 , 第二种用
.catch 方法去捕获异常 ,
catch方法其实就是
then方法的别名 , 相当于
then方法第一个参数传
undefined
// then(成功处理的回调函数, 异常处理的回调函数)ajax('/json1.json').then(ret => {console.log(err)}, err => {console.log(err)})// catchajax('/json1.json').then(ret => {console.log(err)}).catch(err => {console.log(err)})// catchajax('/json1.json').then(ret => {console.log(err)}).then(undefined,err => {console.log(err)})这两种方式还是有很大的差异 ,
catch 其实是在给上一个
then返回的
Promise 捕获异常 , 但是如果是同一个链条下的
Promise的错误会向下传递直到有
catch方法捕获 , 而
then方法传递两个回调函数的捕获异常的方式只会捕获谁上一个
Promise的错误
ajax('/json1.json').then(ret => {console.log(ret)}).then(undefined, err => {console.log(err)}).then(ret => {console.log(ret)}).then(ret => {console.log(ret)})// catch 捕获异常ajax('/json1.json').then(ret => {console.log(ret)}).catch(err => {// 这里能捕获之前的所有Promise的异常})// 传递then 第二个参数捕获异常ajax('/json1.json').then(ret => {console.log(ret)}).then(undefined, err => {console.log(err)throw new Error('故意的异常')}, (err) => {// 这里能捕获故意的错误}).then(ret => {console.log(ret)}).then(ret => {console.log(ret)}).catch(err => {// 这个时候已经捕获不到异常了 , 因为上一个故意的异常已经被捕获了 , 根据then方法会返回一个Promise所以捕获异常之后会返回一个成功的Promise})还可以全局捕获异常,这种全局方式捕获异常是不推荐使用的 , 应该在代码块中明确的去捕获对应的异常
// 浏览器环境中window.addEventListener('unhandledrejection', event => {console.log(event.reason, event.promise)// reason 失败原因 , // promise 失败的Promiseevent.preventDefault()}, false)// nodejs中process.on('unhandledRejection', (reason, promise) => {console.log(reason, promise)// reason 失败原因 , // promise 失败的Promise})如果需要无论成功和错误都需要执行则可以用
finally来实现
ajax('/json1.json').then(ret => {console.log('成功执行这个')}).catch(err => {console.log("失败执行这个")}).finally(function() {console.log("成功和失败都会执行这个")});Promise 静态方法Promise.resolve快速的一个值转化为一个
Promise对象, 这种方式和
new Promise 返回一个值是等价的
Promise.resolve({data: "hahah"})new Promise((resolve) => {resolve({data: "hahah"})})如果传入的是一个
Promise对象会原封不动的把这个对象返回
function ajax (url) {return new Promise((resove, reject) => {var xhr = new XMLHttpRequest()xhr.open('GET', url)// 新方法可以直接接受一个j对象xhr.responseType = 'json'xhr.onload = function () {if (this.status === 200) {resove(this.response)} else {reject(new Error(this.statusText))}}xhr.send()})}let promise1 = ajax('/url')let promise2 = Promise.resolve(promise1)console.log(promise1 === promise2) // true
经验总结扩展阅读
-
-
-
-
陈默|《你安全吗》木桐和陈默的相互“隐瞒”,给了将军多少机会?
-
厌食症|身材自卑疯狂减肥,再也吃不下东西,病态美可能是厌食症惹的祸
-
-
-
-
发型 山城小栗旬还是错付了,夸完自家客人一半水粉,jkl就换了新发型
-
-
事情有一种“反差”叫瘦了的关晓彤,实力证明“巴掌腰”有多细,P图师都懵了
-
2023年2月10日是什么日子 2023年正月廿十黄历查询
-
-
-
很多人都说女儿是父母的贴心小棉袄|女儿嫁过去之后,父母要多少彩礼?
-
安杰|读《父母爱情》原著,才知:安杰对江德福没有爱情,只有认命
-
-
-
-
龙椅|匪夷所思!故宫出现神秘怪事,外国人坐上龙椅后离奇死亡