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

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

  1. Promise async/await的理解和用法

    Promise && async/await的理解和用法 为什么需要promise(承诺)这个东西 在之前我们处理异步函数都是用回调这个方法,回调嵌套的时候会发现 阅读性 和 调试 的 ...

  2. es6 --- promise和async/await的区别

    首先需要了解async函数: async是Generator函数的语法糖: // 使用Generator依次读取两个文件 var fs = require('fs'); var readFile = ...

  3. JavaScript:学习笔记(9)——Promise对象

    JavaScript:学习笔记(9)--Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...

  4. ES6箭头函数以及promise/async/await测试案例

    ES6箭头函数的运用 下面以一段代码解释 function one(){return 1 以上函数用箭头函数写步骤,参考下面代码 {}和里面的东西先删去 one = (里面写参数/无参数的里面为空)= ...

  5. VC++学习笔记(BITMAP与CBitmap的区别)

    VC++学习笔记(BITMAP与CBitmap的区别) BITMAP是一个结构,保存了一些位图的信息: CBitmap是个类,用法:CBitmap bitmap;//创建对象 bitmap.LoadB ...

  6. ASP.Net学习笔记003--网站和WebApplication的区别

    以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交流qq2群:170933152 也可以自己下载: ASP.Net学习 ...

  7. OC语言篇—学习笔记1—C和OC的区别

    学习笔记1-C和OC的区别 1.文件的后缀名 OC:类的头文件 .h,类的实现文件 .m C:类的头文件 .h,类的实现文件.c 2.导入头文件方式 C语言使用include导入头文件,如果想多次引用 ...

  8. rust异步编程--理解并发/多线程/回调/异步/future/promise/async/await/tokio

    1. 异步编程简介 通常我们将消息通信分成同步和异步两种: 同步就是消息的发送方要等待消息返回才能继续处理其它事情 异步就是消息的发送方不需要等待消息返回就可以处理其它事情 很显然异步允许我们同时做更 ...

  9. js callback promise async await 几种异步函数处理方式

    ***callback  这个是最常用的也是最简单的 ,比如在ajax网络请求中,返回请求完成返回的数据 回调函数就是把一个函数当成另一个函数的参数,可以传递函数内的局部变量,也可以异步完成一些操作, ...

最新文章

  1. elasticSearch6源码分析(3)cluster模块
  2. linux mate eth0已下线,Linux Mint 18 Cinnamon 版和 MATE 版已经可以下载了
  3. 【POJ - 3273 】Monthly Expense (二分,最小最大值)
  4. VirtualBox host-only 外网
  5. antd 能自适应吗_Antd表格滚动 宽度自适应 不换行的实例
  6. 分布式锁实现原理与最佳实践
  7. C#反射机制详解(转)
  8. php怎么打印json数据,php输出json格式数据的例子
  9. 指针数组 c ++_了解C ++中的数组指针
  10. Python 可轻松获取天气数据、可视化分析
  11. 凤舞江湖手游如何用电脑玩 凤舞江湖PC电脑版玩法教程
  12. 关于iexplore.exe占用CPU100%的问题
  13. 从高考到程序员——我一直在寻找答案
  14. [CityHunter]游戏流程设计及技术要点
  15. 10年时间,打工妹把一个团队从“一盘散沙”到精英战队,成功实现空手“造”大房···
  16. 织梦图集php,采集功能的使用方法 --- 图片集(一)
  17. 联想惠普谁才是pc的最后王者
  18. 互斥锁的概念和使用方法。
  19. 毕业设计 - 基于Java的聊天室系统设计与实现【源码+论文】
  20. MySQL 语句DML,mysql中的DML语句

热门文章

  1. haskell的分数运算
  2. 索引与联合索引使用注意
  3. “重置”不是“清空”
  4. C语言的sizeof和strlen
  5. 提供一个基于.NET的加密/解密算法
  6. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除
  7. Windows客户端C/C++编程规范“建议”——变量和常量
  8. GDAL库简介以及在Windows下编译过程
  9. 【FFmpeg】ffmpeg命令详解(二)
  10. 【Git】git clone时下载速度太慢的解决方法(亲测有效)