JavaScript异步调用框架的链式实现

在上一篇文章里面,我们为JavaScript异步调用框架设计了一种链式调用方式,来增强异步调用队列的代码可读性,现在我们就来编写实现这部分功能的代码。

调用入口

链式调用存在Async.go方法和Async.chain方法两个入口,这两个入口本质上是一致的,只是Async.chain方法在调用时先不提供初始参数,而Async.go方法在调用时提供了初始参数并启动异步调用链。

 
 
 
  1. Async.chain = function() {  
  2.   var chain = new Async.Operation({ chain: true });  
  3.   return chain;  
  4. };  
  5.  
  6. Async.go = function(initialArgument) {  
  7.   return Async.chain().go(initialArgument);  
  8. }  

在这里我们可以看到,链式调用本身也是一个Async.Operation,链式调用所需的go方法和next方法都是在Async.Operation上面做的扩展,并且这个扩展不会很难,这将在下一小节说明。

扩展方法

我们都知道,通过addCallback方法添加的回调函数是会被逐一执行的,至少同步函数如此,因此我们可以用Async.Operation的这一特性来维护异步调用队列,前提是我们为它加上对异步调用进行队列的支持。

对于异步调用进行队列的支持,我们稍后再来处理,首先我们利用现成的addCallback方法和yield方法扩展出go方法和next方法。

 
 
 
  1. this.go = function(initialArgument) {  
  2.   return this.yield(initialArgument);  
  3. }  
  4.  
  5. this.next = function(nextFunction) {  
  6.   return this.addCallback(nextFunction);  
  7. };  

实际上,go方法和next方法直接调用的正是yield方法和addCallback方法。go方法的语义与yield方法一样,传递一个参数给Async.Operation实例,并且启动调用队列。同时,next方法的语义和addCallback方法,添加一个调用到队列的末端。

异步队列

如何才能让原本仅支持同步的队列变得也支持异步?这需要检测队列中的每一个调用的返回,如果返回类型为Async.Operation,我们知道是JavaScript异步调用,从而使用特殊的方法等它执行完后再执行下去。

 
 
 
  1. callbackResult = callback(self.result);  
  2. self.result = callbackResult;  
  3. if (callbackResult && callbackResult instanceof Async.Operation) {  
  4.   innerChain = Async.chain();  
  5.   while (callbackQueue.length > 0) {  
  6.     innerChain.next(callbackQueue.shift());  
  7.   }  
  8.   innerChain.next(function(result) {  
  9.     self.result = result;  
  10.     self.state = "completed";  
  11.     self.completed = true;  
  12.     return result;  
  13.   });  
  14.   callbackResult.addCallback(function(result) {  
  15.     self.result = result;  
  16.     innerChain.go(result);  
  17.   });  

如果调用返回了一个Async.Operation实例,我们就利用它自身的addCallback方法帮我们执行队列中余下的调用。准确来说,是我们构造了一个新的调用链,把队列余下的调用都转移到新的调用链上,然后让当前异步调用在回调中启动这个新的调用链。

此外还有一些地方我们需要略作修改,以兼容新的异步调用队列的。例如result、state、completed的状态变更,在链式调用中是有所不同的。

小结

我们在原有的Async.Operation上略作修改,使得它支持异步调用队列,完整的代码看这里:支持链式调用的异步调用框架Async.Operation。

现在我们已经拥有了一个功能强大的Async.Operation。这个JavaScript异步调用框架的功能越来越强大了。

本文题目:JavaScript异步调用框架的链式实现
当前网址:http://www.shufengxianlan.com/qtweb/news38/373888.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联