文章同步自我的博客:http://www.52cik.com/2016/07/11/generator-co.htmlhtml
上一篇《让 Generator 自启动》介绍了经过起动器让 Generator 跑起来,而本篇采用 async 实现更优雅的异步编程。编程
借用上一篇例子中的例子提及。并发
function* gen() { var r1 = yield $.get('url1'); var r2 = yield $.get('url2'); var r3 = yield $.get('url3'); console.log(r1, r2, r3); }
而后,咱们须要写一个启动器来启动这个函数。
而采用 async 写,代码则是:异步
async function gen() { var r1 = await $.get('url1'); var r2 = await $.get('url2'); var r3 = await $.get('url3'); console.log([r1, r2, r3].join('\n')); } gen(); // 直接运行便可
直接运行了,无须写生成器来运行了,而代码仅仅是 *
改成 async
, yield
改成 await
而已。
因此本质上讲:async 就是 Generator 的语法糖。async
多任务处理有个坑,就是不能直接在 forEach
, map
之类的方法里处理,不然会报错或者获得错误的结果。异步编程
function sleep(t) { return new Promise(resolve => setTimeout( _ => { resolve(+new Date) }, t)) } async function run() { // 顺序 let a = await sleep(100) let b = await sleep(200) // 并发1 let c = await Promise.all([sleep(100), sleep(200), sleep(300)]) // 并发2 let d = await Promise.all([100, 200, 300].map(t => sleep(t))) // 并发3 let list = [sleep(100), sleep(200), sleep(300)] let e = [] for (let fn of list) { e.push(await fn) } console.log( '', 'a:', a, '\n', 'b:', b, '\n', 'c:', c, '\n', 'd:', d, '\n', 'e:', e, '\n' ) } run() // a: 1468317737179 // b: 1468317737384 // c: [ 1468317737485, 1468317737589, 1468317737688 ] // d: [ 1468317737792, 1468317737890, 1468317737989 ] // e: [ 1468317738094, 1468317738193, 1468317738293 ]
async 没多大的变更,归根结底就是个语法糖,帮助咱们运行生成器,而不须要咱们本身写起动器了。
不过效果确实很是好,让异步编程更加的同步
了。函数