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;
}
// 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)问题详解的更多相关文章
- 大白话讲解Promise(二)理解Promise规范
上一篇我们讲解了ES6中Promise的用法,但是知道了用法还远远不够,作为一名专业的前端工程师,还必须通晓原理.所以,为了补全我们关于Promise的知识树,有必要理解Promise/A+规范,理解 ...
- Es6 Promise 用法详解
Promise是什么?? 打印出来看看 console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...
- angularjs promise详解
一.什么是Promise Promise是对象,代表了一个函数最终可能的返回值或抛出的异常,就是用来异步处理值的. Promise是一个构造函数,自己身上有all.reject.resolve这几个异 ...
- Promise原理讲解 && 实现一个Promise对象 (遵循Promise/A+规范)
1.什么是Promise? Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一 2.对于几种常见异步编程方案 回调函数 事件监听 发布/ ...
- 详解promise、async和await的执行顺序
1.题目和答案 一道题题目:下面这段promise.async和await代码,请问控制台打印的顺序? async function async1(){ console.log('async1 sta ...
- C++11 并发指南四(<future> 详解一 std::promise 介绍)
前面两讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread 和 std::m ...
- angular $q promise详解
前言 通过本文,你大概能清楚angular promise是个啥,$q又是个啥,以及怎么用它.这里咱们先灌输下promise的思想. 下面写的全是废话,一些看着高逼格其实没什么大作用的概念,想知道$q ...
- ES6之Promise用法详解
一 前言 本文主要对ES6的Promise进行一些入门级的介绍.要想学习一个知识点,肯定是从三个方面出发,what.why.how.下面就跟着我一步步学习吧~ 二 什么是Promise 首先是what ...
- js中的promise详解
一 概述 Promise是异步编程的一种解决方案,可以替代传统的解决方案--回调函数和事件.ES6统一了用法,并原生提供了Promise对象.作为对象,Promise有一下两个特点: (1)对象的 ...
随机推荐
- HTTP1.0 与HTTP2.0的区别
一.多路复用 HTTP2.0 使用了多路复用技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级. 二.数据压缩 HTTP1.1不支持header数据压缩,HTTP ...
- 配置maven环境变量并安装jar包到本地仓库
1.下载maven安装包,解压,解压目录如下: 2.配置M2_HOME变量为上一步的路径: 3.配置PATH变量,添加%M2_HOME%\bin; 查看是否配置成功 mvn -v : 4.安装jar ...
- Python作业之用户管理
作业 流程图没有画,懒,不想画 readme没有写,懒,不想写.看注释吧233333 #! /usr/bin/env python # -*- coding: utf-8 -*- # __author ...
- Android Studio中的“favorites”和“bookmark”
做项目难免来回查看某个文件的某个方法,某些文件可能访问率很高, 为了加快开发效率楼主推荐使用favorites (文件)bookmark (代码 行). favorites 的添加就在文件单击右键ad ...
- log4j 配置文件详解
[1]从零开始 a). 新建Java Project>>新建package>>新建java类: b). import jar包(一个就够),这里我用的是log4j-1.2.14 ...
- C++中对类的提前引用声明注意事项
//或许,友元是VC++6.0心里永远的痛,对于这个BUG我一直很介意.//注:这个程序在VC++6.0里是行不通的,在VS2008里是可以的.#include <iostream> #i ...
- oracle 左右链接
数据表的连接有: 1.内连接(自然连接): inner只有两个表相匹配的行才能在结果集中出现 2.外连接: 包括 (1)左外连接(左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接 ...
- nvidia-smi 查看GPU信息字段解读
第一栏的Fan:N/A是风扇转速,从0到100%之间变动,这个速度是计算机期望的风扇转速,实际情况下如果风扇堵转,可能打不到显示的转速.有的设备不会返回转速,因为它不依赖风扇冷却而是通过其他外设保持低 ...
- ftp连接服务器失败||或者Xshell链接错误:Could notconnect to '192.168.18.128' (port 22): Connection failed
有时候刚装完虚拟机发现xshell连接失败,或者使用ftp连接失败.(博主用的是unbuntu,其他linux系统可能在命令上稍有差别,但方法是一样的. xshell连接失败: ftp连接失败: 首先 ...
- Java类加载器回顾
Java类加载采用了全盘委托机制,默认加载类时子类先会委托给父类加载,但父类加载不到时,子类才会自己尝试加载类.这种机制可以有效防止一个类被加载多次,同时也一定程度上防止重写JDK自身的类[Java自 ...