原文: 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. 【bzoj2286】[Sdoi2011]消耗战

    虚树入门题: #include<cstdio> #include<cstring> #include<algorithm> #include<ctime> ...

  2. UOJ Easy Round#7

    UOJ Easy Round#7 传送门:http://uoj.ac/contest/35 题解:http://matthew99.blog.uoj.ac/blog/2085 #1 题意: 在一个(2 ...

  3. java基础以及操作Excle

    今天把会经常用的几个集合的迭代方法又练习了一下,放在这里,经常复习! map集合迭代 /*** 迭代map[1]*/ for (Integer key : map.keySet()) {//迭代key ...

  4. Android系统shell中的clear命令实现【转】

    本文转载自:http://blog.csdn.net/morixinguan/article/details/73467845 之前一直不太清楚,当我们在shell命令行输入很多命令,会在屏幕上输出一 ...

  5. 关于RHEL5中yum挂载iso源引起的问题(转)

    今天在虚机上通过yum挂载iso源来安装rpm包,但提示错误,内容见下面.之前也有过这样的操作, mount后,修改repo文件,然后就可以yum install  rpm包了:过程很简单啊.不知道这 ...

  6. 使用idea导入远程git版本库项目

    1.选择git方式导入 2.设置远程git项目地址 3.测试是否连接成功 4.选择yes,检查项目 5.如果有下一步,直接next下去就可以了.

  7. CISCO-路由器交换机IOS被删,恢复方法

    方式一,tftpdnld方式恢复Router 2600 IOS 1) 将计算机串口和路由器console口相连 一定将计算机网口与路由器第一个以太口f0/0相连. 2) 启动TFTP服务器,并将要下载 ...

  8. 最新版ADT(Build: v22.6.2)总是引用appcompat_v7的问题

    昨天在ADT Manager里更新了一些组件,结果ADT不支持.索性直接下载了最新的ADT.但是发现无论创建什么类型的应用(无论支持的最低API是多少,或者是不是用模板),都会在创建应用的同时创建一个 ...

  9. bootstrap 学习笔记(5)---- 图片和响应式工具

    (一)响应式图片: 在 Bootstrap 版本 3 中,通过为图片添加 .img-responsive 类可以让图片支持响应式布局.其实质是为图片设置了 max-width: 100%;. heig ...

  10. SIM卡(单卡)配置

    SIM卡相关配置 1.GPIO90--->BPI8 GPIO91--->BPI9 GPIO92--->BPI10 2.ProjectConfig.mk:MTK_PROTOCOL1_R ...