原文: 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;
}
// else
looger.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()来处理.

Promise.then(a, b)与Promise.then(a).catch(b)问题详解的更多相关文章

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

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

  2. Es6 Promise 用法详解

     Promise是什么??    打印出来看看  console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...

  3. angularjs promise详解

    一.什么是Promise Promise是对象,代表了一个函数最终可能的返回值或抛出的异常,就是用来异步处理值的. Promise是一个构造函数,自己身上有all.reject.resolve这几个异 ...

  4. Promise原理讲解 && 实现一个Promise对象 (遵循Promise/A+规范)

    1.什么是Promise? Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一 2.对于几种常见异步编程方案 回调函数 事件监听 发布/ ...

  5. 详解promise、async和await的执行顺序

    1.题目和答案 一道题题目:下面这段promise.async和await代码,请问控制台打印的顺序? async function async1(){ console.log('async1 sta ...

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

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

  7. angular $q promise详解

    前言 通过本文,你大概能清楚angular promise是个啥,$q又是个啥,以及怎么用它.这里咱们先灌输下promise的思想. 下面写的全是废话,一些看着高逼格其实没什么大作用的概念,想知道$q ...

  8. ES6之Promise用法详解

    一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...

  9. js中的promise详解

    一 概述   Promise是异步编程的一种解决方案,可以替代传统的解决方案--回调函数和事件.ES6统一了用法,并原生提供了Promise对象.作为对象,Promise有一下两个特点: (1)对象的 ...

随机推荐

  1. java多线程-多线程常识

    线程和进程的区别是什么?进程是一个正在运行的软件程序,打开资源管理器可以看到好多正在运行的进程,而线程则是程序中的顺序控制流,只能使用分配给程序的资源和环境.一个进程至少存在一个线程(主线程). 在j ...

  2. 在js里UTF-8与GB2312的互转

    js的函数如下: function GB2312UTF8() { this.Dig2Dec = function(s) { var retV = 0; if (s.length == 4) { for ...

  3. 003 - 修改Pycharm的项目文件树样式

    相信习惯了Eclipse或者Windows的小伙伴对于Pycharm的目录树一定觉得特别别扭 因为它总是在文件前加一个三角形标注, 这样的标注在视觉上十分误导层级关系 修改的方式为   File -& ...

  4. haprox动态下线后端主机

    haproxy可以很好的支持主机下线,不需要编辑配置文件,也不需要重新reload服务,通过本身的socket发送指令即可: 当你的应用程序是高可用状态,一般部署的是>2的,这个时候就可以通过h ...

  5. 中缀表达式std

    #include<cstdio>#include<cstdlib>#include<string>#include<cstring>using name ...

  6. AtCoder Grand Contest 014 E:Blue and Red Tree

    题目传送门:https://agc014.contest.atcoder.jp/tasks/agc014_e 题目翻译 有一棵有\(N\)个点的树,初始时每条边都是蓝色的,每次你可以选择一条由蓝色边构 ...

  7. bzoj1799同类分布——数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1799 数位DP. 1.循环方法 预处理出每个位数上,和为某个数,模某个数余某个数的所有情况: ...

  8. 获取当前正在运行的activity

    adb shell dumpsys activity activities | findstr "Run"

  9. 五、mysql中sql语句分类及常用操作

    1.sql语句分类: DQL语句 数据查询语言 select DML语句 数据操作语言 insert delete update DDL语句 数据定义语言 create drop alter TCL语 ...

  10. Flutter实战视频-移动电商-26.列表页_使用Provide控制子类-2

    26.列表页_使用Provide控制子类-2 主要实现功能,点击一级分类,二级分类跟着变.这里主要用哦我们的provide 新建provide provide文件夹下创建:child_category ...