JavaScript 异步调用框架 (Part 5 - 链式实现)

 更新时间:2009年08月04日 00:11:43   作者:  
在上一篇文章里面,我们为异步调用框架设计了一种链式调用方式,来增强异步调用队列的代码可读性,现在我们就来编写实现这部分功能的代码。
调用入口
链式调用存在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);
}

在这里我们可以看到,链式调用本身也是一个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);
};

实际上,go方法和next方法直接调用的正是yield方法和addCallback方法。go方法的语义与yield方法一样,传递一个参数给Async.Operation实例,并且启动调用队列。同时,next方法的语义和addCallback方法,添加一个调用到队列的末端。
异步队列
如何才能让原本仅支持同步的队列变得也支持异步?这需要检测队列中的每一个调用的返回,如果返回类型为Async.Operation,我们知道是异步调用,从而使用特殊的方法等它执行完后再执行下去。
复制代码 代码如下:

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);
});
}

如果调用返回了一个Async.Operation实例,我们就利用它自身的addCallback方法帮我们执行队列中余下的调用。准确来说,是我们构造了一个新的调用链,把队列余下的调用都转移到新的调用链上,然后让当前异步调用在回调中启动这个新的调用链。
此外还有一些地方我们需要略作修改,以兼容新的异步调用队列的。例如result、state、completed的状态变更,在链式调用中是有所不同的。
小结
我们在原有的Async.Operation上略作修改,使得它支持异步调用队列,完整的代码看这里:支持链式调用的异步调用框架Async.Operation。
现在我们已经拥有了一个功能强大的Async.Operation,接下来我们就要看看如何将它投入到更多常见的使用模式中去

相关文章

  • layui 对弹窗 form表单赋值的实现方法

    layui 对弹窗 form表单赋值的实现方法

    今天小编就为大家分享一篇layui 对弹窗 form表单赋值的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 教大家轻松制作Bootstrap漂亮表格(table)

    教大家轻松制作Bootstrap漂亮表格(table)

    这篇文章主要为大家详细介绍了Bootstrap轻松制作漂亮表格table的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • filters.revealTrans.Transition使用方法小结

    filters.revealTrans.Transition使用方法小结

    有看到幻灯片调用会用到divid.filters.revealTrans.Transition=Math.floor(Math.random()*23)和divid.filters.revealTrans.apply(),那么这两个都是什么意思呢?
    2010-08-08
  • 禁止拷贝网页内容的js代码

    禁止拷贝网页内容的js代码

    如何禁止拷贝网页内容,想维护下自己的版权,下面有个不错的方法,大家可以学习下
    2014-01-01
  • 微信小程序事件 bindtap bindinput代码实例

    微信小程序事件 bindtap bindinput代码实例

    这篇文章主要介绍了微信小程序事件 bindtap bindinput代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • JavaScript对象学习小结

    JavaScript对象学习小结

    JavaScript 中的所有事物都是对象:字符串、数值、数组、函数.几乎用到的每个js都离不开它的js对象。此外,JavaScript 允许自定义对象,下面跟着小编学习javascript对象学习小结,需要的朋友可以参考下
    2015-09-09
  • JS实现多物体运动

    JS实现多物体运动

    这篇文章主要为大家详细介绍了JS实现多物体运动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 该如何加载google-analytics(或其他第三方)的JS

    该如何加载google-analytics(或其他第三方)的JS

    很多网站为了获取用户访问网站的统计信息,使用了google-analytics或其他分析网站(下面的讨论中只提google-analytics,简称ga)。
    2010-05-05
  • 在JavaScript中实现命名空间

    在JavaScript中实现命名空间

    在JavaScript中实现命名空间...
    2006-11-11
  • 浅谈页面装载js及性能分析方法

    浅谈页面装载js及性能分析方法

    这篇文章主要简单介绍了页面装载js及性能分析方法的相关资料,需要的朋友可以参考下
    2014-12-12

最新评论