从C#到TypeScript - async await
总目录
从C#到TypeScript - async await
上两篇分别说了Promise和Generator,基础已经打好,现在可以开始讲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.all或Promise.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的语法糖。
除了*换成async, yield换成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的更多相关文章
- 【TypeScript】如何在TypeScript中使用async/await,让你的代码更像C#。
[TypeScript]如何在TypeScript中使用async/await,让你的代码更像C#. async/await 提到这个东西,大家应该都很熟悉.最出名的可能就是C#中的,但也有其它语言也 ...
- [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 ...
- [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 ...
- [微信小程序] 终于可以愉快的使用 async/await 啦
[小程序] 终于可以愉快的使用 async/await 啦 这篇文章主要是想说一下 怎么在微信小程序中使用async/await从而逃离回调地狱 背景 最近一直在搞微信小程序 用的语言是TypeScr ...
- angular2 学习笔记 ( Rxjs, Promise, Async/Await 的区别 )
Promise 是 ES 6 Async/Await 是 ES 7 Rxjs 是一个 js 库 在使用 angular 时,你会经常看见这 3 个东西. 它们都和异步编程有关,有些情况下你会觉得用它们 ...
- 优雅地 `async/await`
async/await 虽然取代了回调,使用类似同步的代码组织方式让代码更加简洁美观,但错误处理时需要加 try/catch. 比如下面这样,一个简单的 Node.js 中使用 async/await ...
- How Javascript works (Javascript工作原理) (四) 事件循环及异步编程的出现和 5 种更好的 async/await 编程方式
个人总结: 1.讲解了JS引擎,webAPI与event loop合作的机制. 2.setTimeout是把事件推送给Web API去处理,当时间到了之后才把setTimeout中的事件推入调用栈. ...
- JavaScript 如何工作的: 事件循环和异步编程的崛起 + 5 个关于如何使用 async/await 编写更好的技巧
原文地址:How JavaScript works: Event loop and the rise of Async programming + 5 ways to better coding wi ...
- async & await 的前世今生(Updated)
async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...
随机推荐
- uCOS-iii 中定义的一些常量
uCOS-iii 中定义的一些常量 uCOS-iii 中有许多宏定义的量,这些量不需要全部记住是什么意思,因为在阅读代码的时候可以选中变量或宏定义然后右键查看定义,就可以知道它代表的什么意思.但是如果 ...
- ajax 基础2
连接数据库实现分页功能 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Defa ...
- C++ CRTP singleton
C++ CRTP 是个很有意思的东西,因为解释原理的文章很多,但是讲怎么用的就不是很多了. 今天就稍微写下CRTP(奇异递归模板模式)的一个有趣的用法:Singleton(单例模式) 单例有很多中写法 ...
- Ubuntu14.04下搭建VPN服务
直接上步骤: 1.第一步需要安装PPTP,以用来提供VPN服务. sudo apt-get install pptpd 如果有问题的话比如提示找不到之类的,apt-get update 一下应该就可以 ...
- webgl 网站demo
网络上的一些经典的WebGL资源网站和WebGL开源引擎整理 http://www.babylonjs.com/ http://threejs.org/ http://www.finalmesh.co ...
- UVa 10034 - Freckles
题目大意:给出n个点的坐标(x,y),要求用线段将n个点连接起来,求最小的线段和. 最小生成树问题,用Kruskal算法进行求解,其中用到了并查集.将所有的点连接,构成一张图,对每一条边进行编号,两点 ...
- java_web学习(1)理解JavaBean
JavaBean简介 JavaBean是一种特殊的 Java 类,它遵从一定的设计模式,开发工具和其他组件可以根据这种模式来调用JavaBean. JavaBean可以设计得像Swing组 ...
- Java语言Socket接口用法详解
Socket接口用法详解 在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...
- 有关extdelete恢复测试
客户意外rm掉了数据文件,导致数据库无法打开,由于没有完整的备份和归档,需要使用别的方法,而客户又关闭了数据库,导致无法使用文件描述符恢复,就要使用linux上别的方法了,现记录使用extundele ...
- 超棒的30款JS类库和工具
http://www.csdn.net/article/2013-07-01/2816068-best-javascript-libraries-and-tools