昨天有说到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(二)的更多相关文章

  1. 学JS的心路历程-Promise(三)

    今天我们来说then一些特殊情况以及Promise.all()与Promise.race(). 我们都知道函式作为参数传入时,可以参照的方式传入,也能传入时执行拿回传值作使用: function us ...

  2. 学JS的心路历程-Promise(一)

    今天在进入Promise代码之前,我们先来用个例子来解释Promise是什么. 未来值 假设我们今天来到快餐店,点了一个汉堡,付钱给店员. 点了餐点并付费,可以理解为我们发送了一个请求,希望得到一个回 ...

  3. 学JS的心路历程 -物件与原型(二)

    昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...

  4. 学JS的心路历程-JS支持面向对象?(二)

    昨天讲了面向对象的继承,今天我们来谈谈多态和封装吧! 多态polymorphism 抽象讲法解释,就是使用单一界面操作多种型态的物件 继承父类别,定义与父类别中相同的方法,但实作内容不同,称为复写(o ...

  5. 学JS的心路历程-函式(二)arguments

    参数(argument)与函式参数(parameter) 在讨论函式时,很多人都会把这两个搞混,我自己也不例外. 虽然讲错别人也听得懂,但是我们还是要搞清楚这两个的定义到底是什么! 参数是当我们呼叫函 ...

  6. 学JS的心路历程Day28 - PixiJS -基础(二)

    材质暂存(texture cache) 昨天有说到,图片要放入stage前,需要先把图片转成Sprite的特殊图片物件. 但是我们也可以先将图片放进材质暂存(texture cache). 什么是「材 ...

  7. 学JS的心路历程Day26 - PixiJS -入坑

    后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...

  8. 学JS的心路历程 -非同步执行

    JS是单线程的语言,也就是说同一时间只会执行一行程序,所以如果一段程序执行过久就会造成阻塞(blocking)的现象,必须等到它结束后才能执行下一段程序. 举个例子来说,如果我们今天要买便当,但是老板 ...

  9. 学JS的心路历程 -函式(三)this

    this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...

随机推荐

  1. Javascript的闭包及其使用技巧实例

    Javascript的闭包及其使用技巧实例 一.闭包的基本概念 闭包(Closure)是一个引用了自由变量的函数,记录了该函数在定义时的scope chain.又称词法闭包(Lexical Closu ...

  2. 值得收藏的45个Python优质资源

    REST API:使用 Python,Flask,Flask-RESTful 和 Flask-SQLAlchemy 构建专业的 REST API https://www.udemy.com/rest- ...

  3. IIS7.5和IIS8如何设置FTP的pasv端口范围

    如果不设置端口范围,在防火墙开启的情况下,连接FTP时可能出现列表错误的现象,下面介绍下如何设置FTP的pasv端口范围.. 一.首先打开IIS选择服务器会进入全局设置,再双击FTP防火墙支持 二.设 ...

  4. 百度 OCR API 的使用以及与 Tesseract 的简单对比

    目录 百度 OCR API 初探 用 Python 调用百度 OCR API 与 Tesseract 的简单对比 百度 OCR API 初探 近日得知百度在其 APIStore 上开放了 OCR 的 ...

  5. Jquery ajax 参数 详解

    Jquery ajax 参数主要如下: url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get ...

  6. JVM总结-invokedynamic

    前不久,“虚拟机”赛马俱乐部来了个年轻人,标榜自己是动态语言,是先进分子. 这一天,先进分子牵着一头鹿进来,说要参加赛马.咱部里的老学究 Java 就不同意了呀,鹿又不是马,哪能参加赛马. 当然了,这 ...

  7. 快速了解CSS3当中的HSLA 颜色值怎么算

    CSS3文档中提到:(HSLA) H是色度,取值在0度~360度之间,0度是红色,120度是绿色,240度是蓝色.360度也是红色. S是饱和度,是色彩的纯度,是一个百分比的值,取值在0%~100%, ...

  8. hadoop/hdfs/yarn 详细命令搬运

    转载自文章 http://www.cnblogs.com/davidwang456/p/5074108.html 安装完hadoop后,在hadoop的bin目录下有一系列命令: container- ...

  9. 用myeclipse自动发布web程序

    在myeclipse忠配置好服务器 配置jdk 然后选择tomcat服务器

  10. 转载:“error LNK1169: 找到一个或多个多重定义的符号”的解决方法

    转载来自:http://www.cnblogs.com/A-Song/archive/2012/03/23/2413782.html 问题描述如下: 有 三个源文件,A.h.B.cpp.C.cpp. ...