当前位置: 首页 > 编程日记 > 正文

angular2 学习笔记 ( Rxjs, Promise, Async/Await 的区别 )

Promise 是 ES 6

Async/Await 是 ES 7

Rxjs 是一个 js 库

在使用 angular 时,你会经常看见这 3 个东西.

它们都和异步编程有关,有些情况下你会觉得用它们其中任何一个效果都一样. 但又觉得好像哪里不太对....

这篇就来说说,我在开发时的应用方式.

在 Typescript 还没有支持 Async/Await 的时候, angular 就已经发布了.

那时我们只想着 Promise vs Rxjs

这 2 者其实很好选择, 因为 "可读性" 和 "代码量" 是差不错的.

而 Rxjs 有一些 Promise 没有的特性.

比如一堆的 operator, 这让我们很方便的操作 stream, 这是 Promise 没有的. (可以去看看如何用 rxjs 来实现 search text, triple click 等等, 几行代码就可以完成了)

此外 Rxjs 可以持续的监听和响应, 这点也是 Promise 做不到的.

所以绝大部分情况下,我们鼓励开发者使用 Rxjs.

而在 angular 自带的多种方法中,默认返回的也都是 Rxjs.

结论是 :

a.如果要持续监听和响应或则要用 operator 那么一定是选 Rxjs

b.其它情况就对比 2 者的 "可读性" 和 "代码量" (在没有 Async/Await 的年代, 它们是一样的), 所以还是选 Rxjs 就对了.

后来, Typescript 支持了 Async/Await

这让情况发生了变化.

Async/Await 的 "可读性" 是比 Promise 要好的 (代码越复杂,可读性就越好)

所以刚刚的结论 a 依然没有改变

但是结论 b 就有了变数.

下面我们来看看对比的代码

我们说 Async/Await 可读性高是指 "它的返回方式和我们写同步代码很相似"

let a = getData(); // 同步代码

let a = await getDataAsync(); // Async/Await 代码 

这是它好读的原因.

但是呢.. 当我们加上错误处理时,它也许就没有那么好了.

async click()
{try{let a = await getDataAsync();}catch(e){// handle error 
    }    
}

Async/Await 是用 catch 来捕获的.

这和 java, c# 类似, 读起来还算可以, 但是如果你有多个异步代码, 而且要不同的错误处理呢 ?

async click()
{try{let a = await this.http.get('urlA');let b = await this.http.get('urlB');let c = await this.http.get('urlC');}catch(e){// 我们需要在这里识别出不同的 error 做不同的处理 
    }    
}

把成功和失败的逻辑分开, 并不会让代码更好读, 而且还需要写识别错误的逻辑...

所以我们可以这样写

async click()
{try{let a = await this.http.get('urlA').catch(e => {this.errorMessage = 'A failed';throw '';});let b = await this.http.get('urlB').catch(e => {this.errorMessage = 'B failed';});let c = await this.http.get('urlC');}catch(e){// 什么都不处理 
    }    
}

勉强还行... 但是为什么 .catch 里面还需要 throw 呢 ? 为什么有一个 "什么都不处理呢" ?

这是因为

let a = await this.http.get('urlA').catch(e => {     this.errorMessage = 'A failed';    // 假设没有 throw, let a 会是 undefined, let b, let c 会继续执行... // 假设 return whatever, let b, let c 也会执行. // 你要中断 let b, let c 只有 2 个方法. // 1. throw '';// 2. Promise.reject('');// 这是 Async/Await 和 Promise 不同的地方
});

一旦你 throw 了, 外面就要有人 catch 不然就会 throw 到 angular 的 catch 里头了 (注意我的 click 是 component 的方法).

所以就有了一个

catch(e)
{// 什么都不处理, 其实是为了防止 throw 到 angular 的 catch 里头 /.\ 
}    

写 Promise 是不需要 try catch 的,因为 Promise 一旦进入 reject 就不可能进入下一个 then 了, 而 Async/Await 需要配搭 try catch throw.

结论 :

a.如果要持续监听和响应或则要用 operator 那么一定是选 Rxjs

b.其余情况就看个人了

-看惯了 Promise, 又看不惯 try catch 的话建议用 Promise 就好了.

-但如果 2 种方式你都看的习惯, 那么建议写 Async/Await 吧

因为看不惯 Promise 的人, 你写 Promise, 他就死了.

可是看不惯 try catch 的人, 你写 try catch, 他还死不了.

另外,

Rxjs 有一个 toPromise 的功能, 这有时候让人很困惑的...

要知道 Rxjs.toPromise() 只有在 rxjs.complete 时才会触发.

也就是说如果一个 rxjs 它需要持续监听, 那么你用 toPromise 就会毁了. 一定要用 subscribe

angular 的 http 发了 ajax 后就会 complete 了, 所以你可以使用 toPromise, 但是 ActivatedRoute.paramMap 你 toPromise 就完蛋了, 它不会 complete 所以也就不会触发你的 promise 事件.





转载于:https://www.cnblogs.com/keatkeat/p/7084388.html

相关文章:

【转】Flex Application 初始化顺序

转自&#xff1a;http://www.jexchen.com 大家都知道&#xff0c;我们在编写Flex应用程序时&#xff0c;通常是以<mx:Application>标签作为开头&#xff0c;实际上&#xff0c;Flex应用程序在启动运行的时候并不是直接从Application开始运行&#xff0c;在这之前还有一部…

Matlab编程与数据类型 -- 分支条件选择语句if/end

本微信图文详细介绍了Matlab中if/end分支条件选择语句。

插槽 查看硬盘状态_摄影路上的“全能”伴侣 | LaCie DJI Copilot 移动硬盘

照片的安全是摄影人不得不考虑的问题&#xff0c;尤其是长时间外出拍摄时&#xff0c;一旦出现意外&#xff0c;比如存储卡损坏或丢失&#xff0c;那么千辛万苦拍摄的照片将付之东流&#xff0c;造成无法挽回的损失。虽然意外发生的概率并不高&#xff0c;但是为了保险起见&…

【转载】C语言变量详解

原链接&#xff1a;http://gaga.yo2.cn/articles/detailed-c-language-variables-review.html 刚做题时发现全局变量会自动初始化&#xff0c;如int型则自动初始化为0&#xff0c;double则初始化为0.000000....。而局部变量如果没有初始化的话&#xff0c;初值为一随机数。于是…

Matlab编程与数据类型 -- 多分支条件选择语句if/elseif/…/else/end

本微信图文详细介绍了Matlab中if/elseif/…/else/end多分支条件选择语句。

图解c/c++多级指针与“多维”数组

2019独角兽企业重金招聘Python工程师标准>>> 前言 指针与数组是C/C编程中非常重要的元素&#xff0c;同时也是较难以理解的。其中&#xff0c;多级指针与“多维”数组更是让很多人云里雾里&#xff0c;其实&#xff0c;只要掌握一定的方法&#xff0c;理解多级指针和…

信科c语言实验程序修改题_豆瓣评分 9.3,史上最好的 C 语言著作,竟然翻车了.........

上周&#xff0c;在小编的各种努力下(省略一万字)&#xff0c;Kindle 官方终于答应给我一个广告位了。虽然只是开机屏&#xff0c;但我还是笑出了猪叫&#xff0c;毕竟上一次有这待遇还是 2018 年时的《算法图解》。所以错过了上次&#xff0c;这次我一定要亲眼见证这个时刻。我…

Nodejs Express dockerfile最佳实践

少啰嗦&#xff0c;先看代码 package.json {"name": "xxx","version": "0.0.0","private": true,"scripts": {"start": "node ./bin/www","forever": "node_modules/forever/…

Matlab编程与数据类型 -- 开关语句switch/end

本微信图文详细介绍了Matlab中switch/end开关语句。

安装ATi显卡驱动后增加的鼠标右键菜单的清理

一般最直接的方法是&#xff1a;一般位于注册表的&#xff1a;删除注册表HKEY_CLASSES_ROOT\Directory \Background\shellex\ContextMenuHandlers\ACE下 ab默认{5E2121EE-0300-11D4-8D3B-444553540000}办法一&#xff1a;刚才有朋友询问了ATi显卡在安装CATALYST Control Center…

15crmo焊接后多长时间探伤_15CrMo十五铬钼属于合金钢?、下面来解释一下

15CrMo十五铬钼属于合金钢​&#xff0c;主要用于石油、石化、高压锅炉等&#xff0c;专门用途的无缝管有锅炉用无缝管、地质用无缝钢管及石油用无缝管等多种。​一、15CrMo化学成分&#xff1a;C:0.12-0.18 Mn&#xff1a;0.40-0.70 Si&#xff1a;0.17-0.37 Cr&#xff1a;0.…

VTL-vm模板的变量用法

加载foot模块页 #parse("foot.vm") #foreach($item in $tables) #set($strEnd $item.Length - 1) #set($sheetName $item.Substring(0, $strEnd)) <option value"$item">$sheetName</option> #end $strEnd也可以看做一个字符串来操作 $it…

百度云磁盘CDS、对象存储BOS技术深度解析

在BAT中&#xff0c;百度在公有云也有很多技术创新。比如2013年引起广泛关注的ARM存储服务器就是一个很好的例子。最近两年&#xff0c;百度云开始发力&#xff0c;其云存储体系有诸多创新之处。目前百度云存储形成了以块存储、对象存储、文件存储为核心&#xff0c;VPN/专线、…

Matlab编程与数据类型 -- 出错处理语句try/catch/end

本微信图文详细介绍了Matlab中try/catch/end出错处理语句。

linux设置nexus开机自启动_在linux中使用nexus搭建maven私服

首先介绍下为什么要搭建maven私服&#xff0c;简单点说就是就是把项目工程中的Jar包放在一个服务器上&#xff0c;每次Jar包的修改都能去私服上面Down到本地。可以对整个项目组的人形成一个统一的管理。2、下载完之后就是这个了&#xff1a;我这个是目前最新的版本了&#xff0…

Lintcode42 Maximum Subarray II solution 题解

【题目描述】Given an array of integers, find two non-overlapping subarrays which have the largest sum.The number in each subarray should be contiguous.Return the largest sum.Notice:The subarray should contain at least one number给定一个整数数组&#xff0c;…

const用法详解

面向对象是C的重要特性. 但是c在c的基础上新增加的几点优化也是很耀眼的 就const直接可以取代c中的#define 以下几点很重要,学不好后果也也很严重 const 1. 限定符声明变量只能被读 const int i5; int j0; ... ij; //非法&#xff0c;导致编译错误 ji; //合法 2. 必…

Matlab编程与数据类型 -- continue、break和return语句

本微信图文详细介绍了Matlab中的continue、break和return语句。

mysql 修复_修复崩溃的Mysql

在mysql的配置文件my.cnf里找到 [mysqld]字段下&#xff0c;添加 innodb_force_recovery 1如果innodb_force_recovery 1不生效&#xff0c;则可尝试2——6几个数字然后重启mysql&#xff0c;重启成功。然后使用mysqldump或 pma 导出数据&#xff0c;执行修复操作等。修复完成…

window.open(url?param=+paramvalue) 服务端 乱码问题解决

window.open("url?param"paramvalue)传递参数出现乱码&#xff0c;在客房端显示是正常的&#xff0c;可是到服务端就是乱码。 1. 利用一个js在客户端转码的函数&#xff0c;escape(str);但是传到服务端仍然是乱码&#xff0c;所以必须在服务端进行解码。 2. 服务端执…

Matlab编程与数据类型 -- 数据类型概述

本微信图文详细介绍了Matlab中的数据类型&#xff0c;数值型和逻辑型举例介绍&#xff0c;其它类型在相应图文进行介绍。

初识mysql数据字段属性_初识mysql

# 经典sql语句 创建数据库- CREATE DATABASE database_name; 删除数据库- DROP DATABASE database_name; 创建备份数据库- USE masterEXEC sp_addupdevice disk,testBack ,c:\xxx\xxx.dat 开始备份- BACKUP DATABASE pubs TO testBack;--- 创建表- 创建新表 create table tab_n…

ceph存储引擎bluestore解析

原文链接&#xff1a;http://www.sysnote.org/2016/08/19/ceph-bluestore/ ceph后端支持多种存储引擎&#xff0c;以插件式的方式来进行管理使用&#xff0c;目前支持filestore&#xff0c;kvstore&#xff0c;memstore以及最新的bluestore&#xff0c;目前默认使用的filestor…

Matlab编程与数据类型 -- 字符型数组

本微信图文详细介绍了Matlab中的字符串类型。

最近想做个音乐共享的软件

准备分如下几部分&#xff1a; 1.配置文件xml读写 2.播放器部分&#xff1a;开始准备用mediaplay做&#xff0c;发现有个开源的播放器&#xff0c;可以考虑 3.网络部分&#xff1a;主要是种子搜索和更新 准备召唤有兴趣的达人一起开发转载于:https://www.cnblogs.com/donneymin…

精通mysql_《深入精通Mysql(五)》实战:Mysql实现主从复制

深入精通Mysql系列其他文章推荐&#xff1a;一、前言随着应用业务数据不断的增大&#xff0c;应用的响应速度不断下降&#xff0c;在检测过程中我们不难发现大多数的请求都是查询操作。此时&#xff0c;我们可以将数据库扩展成主从复制模式&#xff0c;将读操作和写操作分离开来…

一个开发团队、软件公司,团队工作氛围很重要,没有好氛围难出好产品、好项目...

接触软件行业很多年有些年头了&#xff0c;展望过去的岁月&#xff0c;总想写点儿东西&#xff0c;总结总结&#xff0c;我也不怕拍砖了&#xff0c;曾经也换过很多公司、跳过很多槽&#xff0c;现在想想&#xff0c;总结出来&#xff1a;“天下的乌鸦是一样黑的”&#xff0c;…

Matlab编程与数据类型 -- 奇数阶魔方矩阵的编程

本微信图文详细介绍了利用Matlab实现奇数阶魔方矩阵的编程。

Apache Hive 快速入门 (CentOS 7.3 + Hadoop-2.8 + Hive-2.1.1)

2019独角兽企业重金招聘Python工程师标准>>> 本文节选自《Netkiller Database 手札》 第 63 章 Apache Hive 目录 63.1. 安装 Apache Hive 63.1.1. MySQL 63.1.2. Hadoop 63.1.3. Hive 63.1.4. 启动 Hive 63.1.5. 访问 Hive 63.2. 管理 Hive 63.2.1. 表管理 63.2.1.…

mysql的profile_Mysql分析-profile详解

一。前言当我们要对某一条sql的性能进行分析时&#xff0c;可以使用它。Profiling是从 mysql5.0.3版本以后才开放的。启动profile之后&#xff0c;所有查询包括错误的语句都会记录在内。关闭会话或者set profiling0 就关闭了。(如果将profiling_history_size参数设置为0&#x…