【TypeScript】如何在TypeScript中使用async/await,让你的代码更像C#。

async/await

提到这个东西,大家应该都很熟悉。最出名的可能就是C#中的,但也有其它语言也实现。比如,Python 3.5中、比如Js中的yield/generator。

Typescript 当前版本1.8.x,1.7版本开始支持async/await, 当然只支持es6编译。2.1版本说是将支持到es5/es3.



Typescript Roadmap : https://github.com/Microsoft/TypeScript/wiki/Roadmap

优点

在这种方式之前,我们主要用的方式,就是回调方式。但如果,你的当前这个调用依赖于回调的数据,当这种关系依赖的多些时候,想想你的代码。

有了 async/await的方式,可以让异步的调用,用起来像同步一样。

场景

想一下这样的场景,有三个http请求,每一个都要依赖上一个请求的返回结果。

我们用js在node中,模拟一下这样的场景。

  1. let http = require('http');
  2. function test() {
  3. http.get('http://www.baidu.com', function (res) {
  4. console.log('the first Status :' + res.statusCode);
  5. http.get('http://www.163.com', function (res2) {
  6. console.log('the second Status :' + res2.statusCode);
  7. http.get('http://www.sina.com', function (res3) {
  8. console.log('the third Status :' + res3.statusCode);
  9. })
  10. })
  11. });
  12. }
  13. test();

我们再来看一下 Typescript 中,用 async/await 的方式。


  1. import http = require('http');
  2. class httpAsync {
  3. constructor() {
  4. }
  5. public async GetAsync(url: string): Promise<http.IncomingMessage> {
  6. var promise = new Promise<http.IncomingMessage>(resolve => {
  7. http.get(url, res => {
  8. resolve(res);
  9. });
  10. });
  11. return promise;
  12. }
  13. }
  14. async function test() {
  15. let ha = new httpAsync();
  16. let res = await ha.GetAsync("http://www.baidu.com");
  17. console.log('the first Status :' + res.statusCode);
  18. res = await ha.GetAsync("http://www.163.com");
  19. console.log('the first Status :' + res.statusCode);
  20. res = await ha.GetAsync("http://www.sina.com");
  21. console.log('the first Status :' + res.statusCode);
  22. }
  23. test();

我们封装了一个httpAsync类,用async方式包装了一下,

对比一个 两个test方法内容,你觉得哪种方式更舒服一些。

如何实现

对C#熟悉的同学,可能很好的理解,因为Promise很像C#中的TaskCompletionSource<T>.

我们来一段 C# 模拟实现这个功能的, C#中的HttpClient本身是支持async/await模式的,大家不要纠结这个,这里只是模拟这个方式 .


  1. public class HttpAsync
  2. {
  3. public Task<HttpResponseMessage> GetAsync(string url)
  4. {
  5. TaskCompletionSource<HttpResponseMessage> tcs = new TaskCompletionSource<HttpResponseMessage>();
  6. HttpClient hc = new HttpClient();
  7. hc.GetAsync(url).ContinueWith(res =>
  8. {
  9. tcs.SetResult(res.Result);
  10. hc.Dispose();
  11. });
  12. return tcs.Task;
  13. }
  14. }

C# 这方面感兴趣的同学,可以去查查,网上的资料很多。

Typescript 实现这种方式,主要是一个关键字 async 和一个对象 Promise<T> .


  1. import http = require('http');
  2. class httpAsync {
  3. constructor() {
  4. }
  5. public async GetAsync(url: string): Promise<http.IncomingMessage> {
  6. var promise = new Promise<http.IncomingMessage>(resolve => {
  7. http.get(url, res => {
  8. resolve(res);
  9. });
  10. });
  11. return promise;
  12. }
  13. }
  • 方法必须用 async 来标记。
  • 可以被 await 的方法必须有返回值 Promise<T> ,如果你的返回值是 void ,那么方法的返回值就是 Promise<void> .
  • Promise<T> 包装你的调用,当成功时调用__resolve__ 回调 结果Promise<T> ,来确定你的异步完成。
  • 可以在 Promise 构造中,再追加一个 reject 参数,来返回执行过程中的原因或错误。
  • Typescript 最终也会把 async/await 的方式编译成 js 中类似 yield/generator 的方式

总结

看看 C#Typescript 的代码,看起来很还是很像的吧。因为他们的老爹都是一个人, C# 之父也是 Typescript 他爹。

在C#中,我们可能已很熟悉这种方式了,但是在 js/ts 中,我们使用的还不多,而且它也不像C#中提供全面的支持库,使用的时候,可能还是得酌情处理。

【TypeScript】如何在TypeScript中使用async/await,让你的代码更像C#。的更多相关文章

  1. [C#] .NET4.0中使用4.5中的 async/await 功能实现异

    好东西需要分享 原文出自:http://www.itnose.net/detail/6091186.html 在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framew ...

  2. 在Silverlight中使用async/await

    现在 async/await 大行其道,确实,有了 async/await ,异步编程真是简单多了,个人觉得 async/await 的出现,给开发者还来的方便,绝不亚于当年 linq 的出现. 但要 ...

  3. 在现有代码中通过async/await实现并行

    在现有代码中通过async/await实现并行 一项新技术或者一个新特性,只有你用它解决实际问题后,才能真正体会到它的魅力,真正理解它.也期待大家能够多分享解一些解决实际问题的内容. 在我们遭遇“黑色 ...

  4. [C#] .NET4.0中使用4.5中的 async/await 功能实现异步

    在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framework 4.0中却无法使用.这时不免面临着抉择,到底是升级整个解决方案还是不使用呢? 如果你的软件还没发布出去 ...

  5. js循环中使用async/await踩过的坑

    最近写koa的时候遇见需要在循环中使用async/await的情况,当然第一反应就是直接上forEach,然后就直接翻车了... 直接上代码: function handleSql(val) { re ...

  6. 理解ES7中的async/await

    理解ES7中的async/await 优势是:就是解决多层异步回调的嵌套 从字面上理解 async/await, async是 "异步"的含义,await可以认为是 async w ...

  7. 浅谈C#中的 async await 以及对线程相关知识的复习

    C#5.0以后新增了一个语法糖,那就是异步方法async await,之前对线程,进程方面的知识有过较为深入的学习,大概知道这个概念,我的项目中实际用到C#异步编程的场景比较少,就算要用到一般也感觉T ...

  8. js中的async await

    JavaScript 中的 async/await 是属于比较新的知识,在ES7中被提案在列,然而我们强大的babel粑粑已经对它进行列支持! 如果开发中使用了babel转码,那么就放心大胆的用吧. ...

  9. .NET4.0中使用4.5中的 async/await 功能实现异步

    在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framework 4.0中却无法使用.这时不免面临着抉择,到底是升级整个解决方案还是不使用呢? 如果你的软件还没发布出去 ...

随机推荐

  1. 记一次PHP7+opcache+zmq出现SIGSEGV 问题的查找(一次不成功的bug查找)

    Title:  记一次PHP7+opcache+zmq出现SEGSEGV问题的查找(一次不成功的bug查找) bug来历自述:线上代码PHP环境是5.2,为了提升性能(逼格),于是升级为PHP7并使用 ...

  2. java导入excel时遇到的版本问题

    java中读取excel文件时对不同的版本提供了不同的读取方法,这就要求我们在读取excel文件时获取excel文件的版本信息从而通过不同的版本去使用不同的读取方式, 在WorkbookFactory ...

  3. 微信公众账号开发之N个坑(二)

    上篇说到微信公众账号的几个坑,前面五个,已经说到菜单,宝宝继续往下赘述了.可惜,还不知道宝宝的宝宝到底是不是心疼宝宝呢,完了,我凌乱了... 回到正题,我们就不吐槽其他的了,上一篇说到微信的菜单了,那 ...

  4. C#高级--通过类来理解学习委托

    namespace classanddelegate { class Program { static void Main(string[] args) { //这是类的实例化 Test test = ...

  5. C#实现:给定任意数字,输出在该数字下所有()括号的集合

    class Program { static void Main(string[] args) { getPairs(, , , , ""); Console.ReadKey(); ...

  6. shell学习--grep2

    grep相关的练习,解释下面grep表达式的含义: grep '\<Tom\>' file 打印file中包含单词 Tom的行 grep 'Tome Savage' file 打印file ...

  7. KMP详解

    原文: http://blog.csdn.net/v_july_v/article/details/7041827 从头到尾彻底理解KMP 1. 引言 本KMP原文最初写于2年多前的2011年12月, ...

  8. Trie树的创建、插入、查询的实现

    原文:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28977986&id=3807947 1.什么是Trie树 Tr ...

  9. 上传App Store成功后,无法构建版本解决方法

    最近iOS10出来了,Xcode也跟着升级到了8,想着App做个更新,于是修改好了代码打算上传新包,无奈总是发现构建不了新版本.这种情况是因为苹果更重视用户的隐私,知道原因就能想到对策了,就是在pli ...

  10. SQL Server 2012安装后找不到服务器名称的解决办法!!!

    网上说使用localhost即可,确实没错,但是有的仍旧会报出无法找到错误,我在无法通过的时候又重新安装了SQLServer,这次选中全部默认安装,之前使用的是选择安装,然后发现多了几个配置,其中有一 ...