原文: When is .then(success, fail) considered an antipattern for promises?

问题

我在bluebrid promise FAQ上面看到, 在那里讲到.then(sucess, fail)是一个antipattern. 我不能理解他关于trycatch的解释. 下面这个例子有什么错误.

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)问题详解相关推荐

  1. ES6中的Promise详解

    Promise 在 JavaScript 中很早就有各种的开源实现,ES6 将其纳入了官方标准,提供了原生 api 支持,使用更加便捷. 定义 Promise 是一个对象,它用来标识 JavaScri ...

  2. 关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出

    1.Promise 基础知识梳理 创建一个Promise实例 const promise = new Promise(function(resolve, reject) {if (success){r ...

  3. 大白话讲解Promise(二)理解Promise规范

    上一篇我们讲解了ES6中Promise的用法,但是知道了用法还远远不够,作为一名专业的前端工程师,还必须通晓原理.所以,为了补全我们关于Promise的知识树,有必要理解Promise/A+规范,理解 ...

  4. 【ES6】Promise对象详解

    [ES6]Promise对象详解 一.Promise对象的含义 二.Promise对象的用法 三.Promise对象的几个应用[重点] 1.时间延迟函数 2.图片异步加载 查看更多ES6教学文章: 参 ...

  5. NodeJS基础2---2 Promise详解

    2019独角兽企业重金招聘Python工程师标准>>> 一.ES6的Promise语言标准.Promise/A+规范 1.Promise是Js针对异步场景的解决方案. Promise ...

  6. Promise详解,相信你看完我这篇文章简单的Promise使用方式基本上就全会了

    Promise 对象 认识Promise对象 语法 new Promise((resolve, reject)=>{resolve();// reject(); }).then(()=>{ ...

  7. 5、this调用语句必须是构造函数中的第一个可执行语句_ES6中的Promise和Generator详解...

    简介 ES6中除了上篇文章讲过的语法新特性和一些新的API之外,还有两个非常重要的新特性就是Promise和Generator,今天我们将会详细讲解一下这两个新特性. Promise 什么是Promi ...

  8. Promise进阶——如何实现一个Promise库

    概述 从上次更新Promise/A+规范后,已经很久没有更新博客了.之前由于业务需要,完成了一个TypeScript语言的Promise库.这次我们来和大家一步一步介绍下,我们如何实现一个符合Prom ...

  9. C++11 并发指南四(future 详解一 std::promise 介绍)

    前面两讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread 和 std::m ...

  10. 关于Promise详解

    异步回调 回调地狱 在需要多个操作的时候,会导致多个回调函数嵌套,导致代码不够直观,就是常说的回调地狱 并行结果 如果几个异步操作之间并没有前后顺序之分,但需要等多个异步操作都完成后才能执行后续的任务 ...

最新文章

  1. 5新建没有头文件_IAR新建工程
  2. 1.Java(初级)编程教程(油管 thenewboston)学习笔记get user input
  3. 带弹出列表的EditText
  4. NEC电影服务器型号,NEC数字电影放映一体机NC2300S-A+详细信息_产品参数_价格_联系方式_DAV数字音视工程网...
  5. 基于JAVA+SpringMVC+MYSQL的宠物管理系统
  6. 智能指针变量做函数参数的一个值得注意的地方
  7. 《『若水新闻』客户端开发教程》——09.代码编写(1)
  8. 工艺仿真软件_中科院科研项目:算法与软件工程集成电路制造中的工艺仿真
  9. fscapture下载收费吗?_听歌要收费,下载又要付费?国内的音乐app还想干什么?...
  10. js 获取father_layer弹出子iframe层父子页面传值
  11. C语言函数调用参数类型不匹配
  12. 北航 软件学院课程 实用软件工具
  13. matlab生成的图片有边,科学网—图片空白边缘处理/统计直方图---matlab/保存生成高质量的清晰图 - 杨小林的博文...
  14. Web程序设计大作业
  15. 计算机总提示优盘格式化,金士顿u盘一插进电脑就提示格式化怎么办?不想格式化又怎么办?...
  16. 二分法求函数零点:(递归方法和非递归方法)
  17. 大学英语综合教程三 Unit 2 课文内容英译中 中英翻译
  18. MATLAB求解非线性方程模型
  19. 【Python常用函数合集】clip函数、range函数等
  20. velocity模板大小写转换

热门文章

  1. Wordpress 太过牛
  2. Centos6.5 邮件服务
  3. mysql中int 5_mysql中int(x)与int以及varchar与char的区别_HelloWorld_ty的博客-CSDN博客
  4. python中安装decimal模块_第38天:Python decimal 模块
  5. c编码实现连接redis服务器
  6. Linux系统编程 -- 多线程间同步和互斥
  7. decode 大于比较 小于_「oracle decode」【ORACLE】Oracle提高篇之DECODE - seo实验室
  8. 使用util.js处理表格
  9. XMLHttpRequest发送XML请求
  10. Spring之不同步的Bean