学JS的心路历程-Promise(二)
昨天有说到Promise的创建以及then的用法,今天我们来看错误处理。
then onRejected
我们昨天有提到说,then两个函式参数,onFulfilled和onRejected,而onRejected则是Promise物件状态转为rejected时呼叫。
不过在使用时要注意Promise是使用split-callback(分离回呼)风格,所以如果我们这样写:
var promise = new Promise((resolve,reject)=> {
resolve(4)
})
promise
.then((val)=>{
throw Error(“error!!“);
})
.then(null,(error)=>{
console.log('err1',error.message);
return“I'm reject return”
});
是没有办法顺利接到错误的,会直接跳出浏览器的错误警告(qstxsj),
但这不是我们所希望的,所以我们必须这样写:
var promise = new Promise((resolve,reject)=> {
resolve(4)
})
promise
.then((val)=>{
throw Error(“error!!“);
},(err)=>{
console.log(err)
});
所以Promise的错误处理,很容易被无声无息的吞掉。为了避免这个问题,通常我们都会在Promise串炼的末端加上catch()。
catch
catch方法其实跟then(undefined,onRejected)方法一样。两者的区别在于,then(undefined,onRejected)通常针对不同的错误处理作回复,而catch通常对错误作统一的回复。
const promise = new Promise((resolve,reject)=> {
resolve(4)
})
promise
.then((val)=> {
console.log(val)//4
return val + 2
})
.then((val)=> {
console.log(val)//6
throw new Error('error!')
})
.catch((error)=>{
console.log('err',error)
})
等同于:
const promise = new Promise((resolve,reject)=> {
resolve(4)
})
promise
.then((val)=> {
console.log(val)//4
return val + 2
})
.then((val)=> {
console.log(val)//6
throw new Error('error!')
})
.then(null,(error)=>{
console.log('err',error)
})
那如果我们同时写,then(undefined,onRejected)和catch会怎么样呢:
const promise = new Promise((resolve,reject)=> {
resolve(4)
});
promise
.then((val)=> {
console.log(val)//4
throw Error('error!')
})
.then(null,(error)=>{
console.log('err1',error.message);
return“I'm reject return”
})
.catch((err)=> {
console.log(“err2”,err.message);
return“I'm catch return”
})
.then((val)=>{
console.log(val);
},(error)=>{
console.log('err1',error.message);
})
//4
// err1 error!
// I'm reject return
可以看到说是谁在前面就会先显示(qqggcm)。
以上就是Promise的错误处理,如果有错误及来源未附上也欢迎留言指正,那么我们明天见。
学JS的心路历程-Promise(二)的更多相关文章
- 学JS的心路历程-Promise(三)
今天我们来说then一些特殊情况以及Promise.all()与Promise.race(). 我们都知道函式作为参数传入时,可以参照的方式传入,也能传入时执行拿回传值作使用: function us ...
- 学JS的心路历程-Promise(一)
今天在进入Promise代码之前,我们先来用个例子来解释Promise是什么. 未来值 假设我们今天来到快餐店,点了一个汉堡,付钱给店员. 点了餐点并付费,可以理解为我们发送了一个请求,希望得到一个回 ...
- 学JS的心路历程 -物件与原型(二)
昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...
- 学JS的心路历程-JS支持面向对象?(二)
昨天讲了面向对象的继承,今天我们来谈谈多态和封装吧! 多态polymorphism 抽象讲法解释,就是使用单一界面操作多种型态的物件 继承父类别,定义与父类别中相同的方法,但实作内容不同,称为复写(o ...
- 学JS的心路历程-函式(二)arguments
参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...
- 学JS的心路历程Day28 - PixiJS -基础(二)
材质暂存(texture cache) 昨天有说到,图片要放入stage前,需要先把图片转成Sprite的特殊图片物件. 但是我们也可以先将图片放进材质暂存(texture cache). 什么是「材 ...
- 学JS的心路历程Day26 - PixiJS -入坑
后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...
- 学JS的心路历程 -非同步执行
JS是单线程的语言,也就是说同一时间只会执行一行程序,所以如果一段程序执行过久就会造成阻塞(blocking)的现象,必须等到它结束后才能执行下一段程序. 举个例子来说,如果我们今天要买便当,但是老板 ...
- 学JS的心路历程 -函式(三)this
this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...
随机推荐
- centos 7怎么通过图形界面来配置静态ip
除了通过修改配置文件的方法来配置静态ip,我们还可以通过图形界面来配置,这样做其实更加方便一点 先进入设置页面 选择网络 我这里是通过有线上网的,我们之间修改配置就可以了 选择ipv4,和manual ...
- 通过mapreduce把mysql的一张表的数据导到另外一张表中
怎么安装hadoop集群我在这里就不多说了,我这里安装的是三节点的集群 先在主节点安装mysql 启动mysql 登录mysql 创建数据库,创建表格,先把数据加载到表格 t ,表格t2是空的 mys ...
- useful tools and website
1.https://www.processon.com/ 在线流程图制作网站 2.http://www.easyicon.net/ 专门下载图标的网站 3.https://www.lfd.uci ...
- WebView长按保存图片;WebView不跳转到系统的浏览器;WebView加载显示进度条;WebView返回事件处理;
直接看代码即可,代码里面注释写的很清楚,这个类拉下来就能用: 写法和命名比较粗暴,但也简单易懂: public class MainActivity extends AppCompatActivity ...
- SVG 学习<五> SVG动画
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
- redis 连接超时。。
在虚拟机安装后.在项目中加入redis 想测试一下功能 然后在物理机死活连不上. 1.用物理机ping 虚拟机的IP 通.... 2.然后.把redis.conf 里面bind 0.0.0.0 依然没 ...
- idea 控制台行数限制
在本地进行测试时,会出现报错太多idea控制台被限制打印出来的日志被清楚的现象: idea改变控制台打印log限制的方法: 1. 点击 File ->Settings ->editor - ...
- JavaScript数组的五个迭代方法的简单实例
<script> //every() var nums = [1,2,3,4,5]; var result = nums.every(function eve(item,index,arr ...
- 基于canvas的电子始终
//code <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...
- Android Data Binding Library
Data Binding Library Data Binding Library是一个支持库,允许您使用声明格式(而不是编程)将布局中的UI组件与应用程序中的数据源绑定. 布局通常在调用UI框架方法 ...