ECMAScript6中的异步处理机制

Promise对象, Generator函数,asyn函数

Promise对象的提出主要解决了两个问题,一是使得异步流程的表达更加语义化,以newPromise(function (resolve,reject)).then()的形式使得异步事件同步化表达,二是解决了回调函数地狱问题,将回调函数的嵌套改成了链式调用写法。

Promise对象强于事件处理机制的一点便是其提供统一的接口处理异步事件,不需要实时监听,即使错过仍然会得到处理结果。但这种机制也带来了一定的缺点,一是无法得知事件具体进行到了哪一个阶段,二是内部错误不会反应到外部,需要设置回调函数。

Generator函数可以理解为一个状态机,可以封装内部状态,返回一个遍历器对象用于遍历内部状态,yield表达式用于暂停执行,next()方法用于恢复执行。这种机制使得其可以封装异步任务,异步Generator函数是Generator函数和aysnc函数的结合,其返回一个Promise对象。同时next()方法可以带参数作为上一个yield表达式的返回值,使得内外部数据交换成为可能,可以在其函数执行中向上下文注入值。其错误处理机制与Promise对象相比也更为灵活,返回的遍历器对象会带一个throw方法,使得错误可以在函数体内捕获,Generator函数内部没有部署try…catch方法,所以抛出的错误在函数体外进行处理。同时,Generator函数体外抛出的错误也可以在函数体内进行捕获;与传统异步编程解决方案相比,其错误处理机制也具有一定的优势,传统方案中异步任务第一阶段执行完后上下文就会在堆栈中消失,如果此时抛出错误不能及时捕捉,只能在任务的第二阶段进行处理。但Generator函数执行上下文在执行完成之前都会在堆栈中存在,并不会消失。

但其不能自动执行,需要使用for…await of 或者自己编写执行器模块,与Thunk函数结合可以实现异步流程管理,使用回调函数或者Promise对象将执行权再交回给Generator函数。

除此之外,Generator函数另一个重要的应用就是 部署Iterator接口,使对象可遍历。

Async函数是内置执行器的Generator函数,也可以看成多个异步操作包装成的一个Promise对象。与Generator函数相比,其具有更广的适用性。Generator函数自动执行模块对yield表达式后面加的值有诸多的限制,只能是Promise对象或是Thunk函数,await命令后面除了Promise对象还可以跟原始值,如果不是Promise对象,会调用resolve方法将其转换为Promise对象。

 

异步处理机制的应用

1.     异步加载图片,性能优化;

2.     半协程实现(Generator函数);

 

注:

回调函数地狱(callback hell):多个异步操作强耦合。

Thunk函数:将多参数函数替换成只接受回调函数作为参数的单参数函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值