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

开发 前端
本文描述JavaScript异步调用框架的链式实现。链式调用存在Async.go方法和Async.chain方法两个入口,这两个入口本质上是一致的。

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

调用入口

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

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

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

扩展方法

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

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

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

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

异步队列

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

callbackResult = callback(self.result);  
self.result = callbackResult;  
if (callbackResult && callbackResult instanceof Async.Operation) {  
  innerChain = Async.chain();  
  while (callbackQueue.length > 0) {  
    innerChain.next(callbackQueue.shift());  
  }  
  innerChain.next(function(result) {  
    self.result = result;  
    self.state = "completed";  
    self.completed = true;  
    return result;  
  });  
  callbackResult.addCallback(function(result) {  
    self.result = result;  
    innerChain.go(result);  
  });  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

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

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

小结

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

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

【编辑推荐】

  1. JavaScript异步调用框架的jQuery风格链式调用
  2. JavaScript异步调用框架的代码实现
  3. JavaScript异步调用框架用例设计
  4. JavaScript异步调用框架问题描述
  5. 浅谈如何用Javascript+VML实现流程设计器
责任编辑:yangsai 来源: Cat in dotNET
相关推荐

2009-07-01 14:31:01

JavaScript异

2009-07-01 14:23:46

JavaScript异

2009-07-01 13:58:00

JavaScript异

2009-07-01 14:05:23

JavaScript异

2009-10-20 16:48:30

C#委托

2009-08-21 11:24:16

C#异步调用

2024-08-12 10:13:01

2022-09-27 12:01:56

Spring异步调用方式

2009-12-21 14:10:26

WCF异步调用

2010-02-25 09:13:34

WCF异步调用

2009-11-09 10:50:30

WCF异步调用

2010-03-01 14:01:50

WCF服务异步调用

2022-09-28 14:54:07

Spring注解方式线程池

2021-03-29 09:26:44

SpringBoot异步调用@Async

2024-10-15 10:28:43

2024-07-31 15:57:41

2009-08-21 11:02:55

C#异步调用

2009-11-06 15:54:15

WCF异步调用

2022-07-01 08:14:28

Dubbo异步代码

2010-02-22 13:28:05

WCF异步调用
点赞
收藏

51CTO技术栈公众号