Promise.then(a, b)与Promise.then(a).catch(b)问题详解
原文: When is .then(success, fail) considered an antipattern for promises?
问题
我在bluebrid promise FAQ上面看到, 在那里讲到.then(sucess, fail)
是一个antipattern. 我不能理解他关于try
和catch
的解释. 下面这个例子有什么错误.
some_promise.call()
.then(function(res) {logger.log(res), function(err) {logger.log(err)}})
这好像表示出, 下面才是正确的使用方式.
some_promise_call()
.then(function(res) {logger.log(res)})
.catch(function(err) {logger.log(err)})
这两个例子有什么不同?
解答
他们有什么不同
这个.then()
会返回一个promise, 这个promise,以防在回调函数中出现的错误. 以便进行rejected的执行. 这意味着, 当你成功的logger
执行的过程中, 发生了错误, 这个错误就会通过下一个.catch
中的回调函数捕获, 但是没有办法在sucess
后面的fail
回调函数所捕获.
下面是一张控制流程图:
在同步代码中展示:
// some_promise_call().then(looger.log, looger.log)
then: {try {var resluts = some_call()} catch(e) {logger.log(e)break then;}// elselooger.log(resluts)
}
第二个log
(就像是在.then
中的第一个参数), 只有在没有异常发生的时候执行. 这种块级运行和break
语法看起来有点奇怪. 这其实就是Python中的try-except-else
(推荐阅读).
// some_promise_call().then(logger.log).catch(logger.log)
try {var results = some_call()logger.log(results)
} catch (e) {logger.log(e)
}
这个catch
也会捕获来着成功logger这个函数执行中所发生的异常.
他们有非常大的不同.
我不理解他关于try和catch的解释
分歧点就是在于你想要每一步都捕获错误, 还是不喜欢在链式中捕获错误. 一种预期就是你希望所有的错误都通过同一种错误处理, 当然, 当你使用antipattern
(反模式)的时候, 错误在一些then的回调中并没有进行处理.
然而, 这种模式的确非常有用. 当你确实希望错误发生的时候, 只在那一步进行处理, 并且你希望做一些完全不同的错误处理. 也就是这个错误是不可恢复的. 注意, 那就是你的流程控制分支, 当然, 在某些情况下他会非常实用.
关于你这个例子的错误
// 询问错误的例子:
some_promise_call()
.then(function(res) {logger.log(res)}), function(err) {logger.log(err}})
当你需要重复你的回调函数的时候, 也就是catch后面继续执行的时候, 最好这么处理:
some_promise_call()
.catch(function(e) {return e // 这是完全可以的, 我们将会打印这个错误
})
.done(function(res) {logger.log(res)
})
你也可以继续使用.finally()
来处理.
转载于:https://www.cnblogs.com/zhangrunhao/p/10210386.html
Promise.then(a, b)与Promise.then(a).catch(b)问题详解相关推荐
- ES6中的Promise详解
Promise 在 JavaScript 中很早就有各种的开源实现,ES6 将其纳入了官方标准,提供了原生 api 支持,使用更加便捷. 定义 Promise 是一个对象,它用来标识 JavaScri ...
- 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出
1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) {if (success){r ...
- 大白话讲解Promise(二)理解Promise规范
上一篇我们讲解了ES6中Promise的用法,但是知道了用法还远远不够,作为一名专业的前端工程师,还必须通晓原理.所以,为了补全我们关于Promise的知识树,有必要理解Promise/A+规范,理解 ...
- 【ES6】Promise对象详解
[ES6]Promise对象详解 一.Promise对象的含义 二.Promise对象的用法 三.Promise对象的几个应用[重点] 1.时间延迟函数 2.图片异步加载 查看更多ES6教学文章: 参 ...
- NodeJS基础2---2 Promise详解
2019独角兽企业重金招聘Python工程师标准>>> 一.ES6的Promise语言标准.Promise/A+规范 1.Promise是Js针对异步场景的解决方案. Promise ...
- Promise详解,相信你看完我这篇文章简单的Promise使用方式基本上就全会了
Promise 对象 认识Promise对象 语法 new Promise((resolve, reject)=>{resolve();// reject(); }).then(()=>{ ...
- 5、this调用语句必须是构造函数中的第一个可执行语句_ES6中的Promise和Generator详解...
简介 ES6中除了上篇文章讲过的语法新特性和一些新的API之外,还有两个非常重要的新特性就是Promise和Generator,今天我们将会详细讲解一下这两个新特性. Promise 什么是Promi ...
- Promise进阶——如何实现一个Promise库
概述 从上次更新Promise/A+规范后,已经很久没有更新博客了.之前由于业务需要,完成了一个TypeScript语言的Promise库.这次我们来和大家一步一步介绍下,我们如何实现一个符合Prom ...
- C++11 并发指南四(future 详解一 std::promise 介绍)
前面两讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread 和 std::m ...
- 关于Promise详解
异步回调 回调地狱 在需要多个操作的时候,会导致多个回调函数嵌套,导致代码不够直观,就是常说的回调地狱 并行结果 如果几个异步操作之间并没有前后顺序之分,但需要等多个异步操作都完成后才能执行后续的任务 ...
最新文章
- 5新建没有头文件_IAR新建工程
- 1.Java(初级)编程教程(油管 thenewboston)学习笔记get user input
- 带弹出列表的EditText
- NEC电影服务器型号,NEC数字电影放映一体机NC2300S-A+详细信息_产品参数_价格_联系方式_DAV数字音视工程网...
- 基于JAVA+SpringMVC+MYSQL的宠物管理系统
- 智能指针变量做函数参数的一个值得注意的地方
- 《『若水新闻』客户端开发教程》——09.代码编写(1)
- 工艺仿真软件_中科院科研项目:算法与软件工程集成电路制造中的工艺仿真
- fscapture下载收费吗?_听歌要收费,下载又要付费?国内的音乐app还想干什么?...
- js 获取father_layer弹出子iframe层父子页面传值
- C语言函数调用参数类型不匹配
- 北航 软件学院课程 实用软件工具
- matlab生成的图片有边,科学网—图片空白边缘处理/统计直方图---matlab/保存生成高质量的清晰图 - 杨小林的博文...
- Web程序设计大作业
- 计算机总提示优盘格式化,金士顿u盘一插进电脑就提示格式化怎么办?不想格式化又怎么办?...
- 二分法求函数零点:(递归方法和非递归方法)
- 大学英语综合教程三 Unit 2 课文内容英译中 中英翻译
- MATLAB求解非线性方程模型
- 【Python常用函数合集】clip函数、range函数等
- velocity模板大小写转换
热门文章
- Wordpress 太过牛
- Centos6.5 邮件服务
- mysql中int 5_mysql中int(x)与int以及varchar与char的区别_HelloWorld_ty的博客-CSDN博客
- python中安装decimal模块_第38天:Python decimal 模块
- c编码实现连接redis服务器
- Linux系统编程 -- 多线程间同步和互斥
- decode 大于比较 小于_「oracle decode」【ORACLE】Oracle提高篇之DECODE - seo实验室
- 使用util.js处理表格
- XMLHttpRequest发送XML请求
- Spring之不同步的Bean