异步编程系列教程:
- (翻译)异步编程之Promise(1)——初见魅力
- 异步编程之Promise(2):探究原理
- 异步编程之Promise(3):拓展进阶
- 异步编程之Generator(1)——领略魅力
- 异步编程之Generator(2)——剖析特性
- 异步编程之co——源码分析
拓展功能
在前面的文章中,通过了解promise能做什么,实践动手从原理上了解promise/deferred
模式的用法,相信大家应该更期待这次的功能拓展。我们不仅需要让单异步操作promise化,我们还需要从实际出发,拓展更多有用的功能。直接看一下我们这一次需要做的两个功能:
- 多异步并行控制
- 多异步串行队列
这两个功能用我们之前自己写的简陋promise库,是无法做到的。我们不能在指定多个promise异步完成后,再触发回调。也不能让多个promise异步像排队一样,一个一个的进行,甚至下一个promise的参数是依赖上一个promise的。这就是我们接下来需要解决的问题:
多异步并行控制
在冻手之前,我们先想一想大致的思路吧。首先我们肯定是并发了多个异步,我们需要做的仅仅就是,监控所有并发的异步,并让最后一个异步触发resolve
回调函数。当然错误处理的话,就是当有一个异步错误,直接就reject
掉宣布异步失败结束。一般监视并发,我们都会有一个哨兵变量,每完成一个异步,就对哨兵进行维护并检测异步是否结束。
那我们的API应该怎么设置呢?朴灵老师的书上是这样的:deferred.all([promise1, promise2]).then()
。从这里我们可以看出,就是由各个小promise组成了一个大的promise,并在大promise中进行接下来的操作。一起看一下代码吧:
1 | Deferred.prototype.all = function(promises){ |
我个人认为最不好懂的应该是_this
到底指的是什么?看过上一篇的朋友,应该知道deferred是延迟对象来的,作用就是触发即将在then()
中绑定的resolve()
和reject()
。那这里的_this
必然是指大的promise,我们看一下如何使用的: