总目录

从C#到TypeScript - async await

上两篇分别说了PromiseGenerator,基础已经打好,现在可以开始讲async await了。

async await是ES7的议案,TypeScript在1.7版本开始支持async await编译到ES6,并在2.1版本支持编译到ES5和ES3,算是全面支持了。

async await 用法

和C#里的十分相似,看个例子:

function delay(): Promise<void>{
return new Promise<void>((resolve, reject)=>{setTimeout(()=>resolve(), 2000)});
} async function run(){
console.info('start');
await delay();
console.info('finish');
} run();
console.info('run');

上面代码执行的结果是执行完run()后立即返回一个Promise,遇到await跳出函数,继续往下走,所以先输出start,再紧接着输出run,过了2秒后再输出finish

可以看到run函数,function前面多了个async(如果是class里的方法,则是在函数名前),delay()前面多了个await,表示的意思很明显,就是在两者之间等待2秒。

run函数返回的也是一个Promise对象,后面可以接then来做后续操作。

await必须要在async块中,await的对象可以是Promise对象也可以不是,不是的话会自动转为已经resolved的Promise对象。

另外,await在代码块中是按顺序执行的,前面wait完后再会走下一步,如果需要并行执行,可以和Promise一样,用Promise.allPromise.race来达到目的。

async function run1(){
await delay();
console.info('run1');
}
async function run2(){
await delay();
console.info('run2');
}
async function run3(){
await delay();
console.info('run3');
}
Promise.all([run1(), run2(), run3()]);

上面代码会在两秒后几乎同时输出run1, run2, run3。

async返回Promise状态

一个async函数中可以有N个await,async函数返回的Promise则是由函数里所有await一起决定,只有所有await的状态都resolved之后,async函数才算真正完成,返回的Promise的状态也变为resolved。

当然如果中间return了或者出了异常还是会中断的。

async function run(){
console.info('start');
await delay();
console.info('time 1');
await delay();
console.info('time 2');
return;
//下面当然就不会执行了
await delay();
console.info('time 3');
}

run的状态在time 2输出后return就转为resolved了。

当这里出异常时,async函数会中断并把异常返回到Promise里的reject函数。

async function run(){
await Promise.reject('error'); // 这里出异常
console.info('continue'); // 不会执行到这里
await delay();
}

异常处理

之前有提到Promise的异常可以在后面用catch来捕获,async await也一样。

向上面的例子,可能有需要把整个函数即使出异常也要执行完,就可以这样做:

async function run(){
await Promise.reject('error').catch(e=>console.info(e));
console.info('continue'); // 继续往下执行
await delay();
} let g = run(); //这里的g也是成功的,因为异常已经被处理掉

如果是多个异常需要处理,可以用try...catch

async function run(){
try{
await Promise.reject('error1');
await Promise.reject('error2');
} catch(e){
console.info(e);
}
console.info('continue'); // 继续往下执行
await delay();
}

async await原理

前篇有说过async await其实是Generator的语法糖。

除了*换成asyncyield换成await之外,最主要是async await内置了执行器,不用像Generator用那样next()一直往下执行。

其实也就是async await内部做了co模块做的事。

先来看看async await在TypeScript翻译后的结果:

async function run(){
await delay();
console.info('run');
}
//翻译成
function run() {
return __awaiter(this, void 0, void 0, function* () {
yield delay();
console.info('run');
});
}

可以注意到其实还是用__await()包了一个Generator函数,__await()的实现其实和上篇的co模块的实现基本一致:

var __awaiter = (this && this.__awaiter) ||
function(thisArg, _arguments, P, generator) {
return new(P || (P = Promise))(function(resolve, reject) {
function fulfilled(value) { // 也是fulfilled,resolved的别名
try {
step(generator.next(value)); // 关键还是这个step,里面递归调用fulfilled
} catch (e) {
reject(e);
}
} function rejected(value) {
try {
step(generator["throw"](value));
} catch (e) {
reject(e);
}
} function step(result) {
result.done ? resolve(result.value) : new P(function(resolve) { //P是Promise的类型别名
resolve(result.value);
}).then(fulfilled, rejected); // 没有done的话继续fulfilled
}
step((generator = generator.apply(thisArg, _arguments)).next());
});
};

从C#到TypeScript - async await的更多相关文章

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

    [TypeScript]如何在TypeScript中使用async/await,让你的代码更像C#. async/await 提到这个东西,大家应该都很熟悉.最出名的可能就是C#中的,但也有其它语言也 ...

  2. [Typescript] Promise based delay function using async / await

    Learn how to write a promise based delay function and then use it in async await to see how much it ...

  3. [TypeScript] Simplify asynchronous callback functions using async/await

    Learn how to write a promise based delay function and then use it in async await to see how much it ...

  4. [微信小程序] 终于可以愉快的使用 async/await 啦

    [小程序] 终于可以愉快的使用 async/await 啦 这篇文章主要是想说一下 怎么在微信小程序中使用async/await从而逃离回调地狱 背景 最近一直在搞微信小程序 用的语言是TypeScr ...

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

    Promise 是 ES 6 Async/Await 是 ES 7 Rxjs 是一个 js 库 在使用 angular 时,你会经常看见这 3 个东西. 它们都和异步编程有关,有些情况下你会觉得用它们 ...

  6. 优雅地 `async/await`

    async/await 虽然取代了回调,使用类似同步的代码组织方式让代码更加简洁美观,但错误处理时需要加 try/catch. 比如下面这样,一个简单的 Node.js 中使用 async/await ...

  7. How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式

    个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...

  8. JavaScript 如何工作的: 事件循环和异步编程的崛起 + 5 个关于如何使用 async/await 编写更好的技巧

    原文地址:How JavaScript works: Event loop and the rise of Async programming + 5 ways to better coding wi ...

  9. async & await 的前世今生(Updated)

    async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...

随机推荐

  1. Tessnet2图片识别(2)

    1. 引用 tessnet2.dll (只有NET2.0版本) 2. 视图页 <%@ Page Language="C#" MasterPageFile="~/Vi ...

  2. adb报错:The connection to adb is down, and a severe&nbs

    我觉得这就像是adb的大姨妈一样,不过处理起来还是很easy滴:  1.报错:BUILD FAILEDD:\workspace\ganji\build.xml:144: The following e ...

  3. javascript--hasOwnProperty()+isPrototypeof()+in方法

    1.hasOwnProperty():用来检测对象中是否包含给出的函数属性或者对象,但是无法检测出对象的原型链中是否包含给出的属性或对象--该属性或者对象必须在函数内部被声明 2.isPrototyp ...

  4. Android 控件布局常用属性

    <!--单个控件经常用到android:id —— 为控件指定相应的IDandroid:text —— 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串a ...

  5. windows下Nodejs环境部署

    前言 Nodejs是基于v8引擎的轻量级框架,其特点为事件驱动.非阻塞.单线程.异步回调等. Nodejs相对于其他运行在服务器端的语言,容易学习,使用方便. 本文将介绍windows下Nodejs的 ...

  6. 使用UTF8-CPP转换unicode编码 附录:UTF8和UTF16和UTF32和Unicode编码

    本文用于解决如何用C++处理字符串的编码格式.本文采用的是成熟便捷的UTF8库来处理这个问题.首先是下载UTF8库,网址为:http://utfcpp.sourceforge.net/ 为了方便后续使 ...

  7. HTML5学习笔记三:aside元素,time元素与微格式

    一.aside元素 表示当前页面或文章的附属信息部分,相关的引用,侧边栏,广告等有别于主要内容的部分:主要有一下两种用法: 1. 被包含在article元素中作为主要内容的附属信息部分,可以是与当前文 ...

  8. C++第三天学习

    回顾: 类和对象 class 类名 { public: private: 在类的类部可以访问,在类的外部不能直接访问. protected: 在类的类部可以访问,在类的外部不能直接访问,其子类可以访问 ...

  9. ZooKeepr日志清理

    http://blog.csdn.net/xiaolang85/article/details/21184293

  10. 求求别再这么用log4x了

    sl4j或者log4j中,推荐的记录方式是: private Logger log = Logger.getLogger(getClass()); //或者 private static final ...