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

作者:小括号

时间:2026-10-23

浏览:185

本文深入解析 JavaScript 异步调用框架的链式实现机制。通过 Async.chain 和 Async.go 两个入口,利用 Async.Operation 扩展 go 和 next 方法,构建支持异步的调用队列。核心逻辑在于检测返回值是否为 Async.Operation 实例,若是则创建新链并委托其执行剩余任务,从而实现复杂的异步流程控制。

文章目录
调用入口

链式调用入口:Async.chain与Async.go

链式调用提供了 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 的扩展,具体实现逻辑将在后续小节展开。


扩展方法:go与next的实现

扩展方法


已知通过 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,接下来将探讨如何将其应用于更多常见的使用模式中。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章