蛙蛙推荐:javascript异步任务流
如下一些任务,每个任务都是异步执行的,因为它们都要去网络上取一些数据,而且不知道什么时间能执行完成。
function output(msg){
$("#debug").append("<p>"+msg+"</p>");
}
function work1(callback){
output("begin work1");
$.get('data.js', function(data){
output("end work1");
if(typeof callback == 'function'){
callback();
}
});
}
function work2(callback){
output("begin work2");
$.get('data.js', function(data){
output("end work2");
if(typeof callback == 'function'){
callback();
}
});
}
function work3(callback){
output("begin work3");
$.get('data.js', function(data){
output("end work3");
if(typeof callback == 'function'){
callback();
}
});
}
如果我们同步调用这些任务,
work1();
work2();
work3();
会出现如下结果
begin work1
begin work2
begin work3
end work1
end work2
end work3
但我们想第一个任务完成后再执行第二个任务,依次类推,如果不借助异步框架的支持,我们就需要修改work1,work2,work3的代码,让他们完成后执行相应的后续任务,这样以后要修改任务流就需要改动具体任务的代码,变化点比较分散。
也可以在开始执行任务前准备一些回调函数,然后再开始,这样封装了变化点,提高了代码的可读性,大致如下
var callback3 = function(){work3();};
var callback2 = function(){work2(callback3);};
var callback1 = function(){work1(callback2);}
callback1();
执行结果如下
begin work1
end work1
begin work2
end work2
begin work3
end work3
可以看到这段代码虽然执行结果符合预期,但可读性和可维护性太差了,一大串匿名函数,而且写的顺序还得仔细注意,所以我写了个小框架了让它变的简单。
function AsyncWorkManager(){
this.works = [];
}
AsyncWorkManager.prototype.addWork = function(callee, caller){
if(typeof callee!= 'function')
throw {name:"TypeError",message:"work must be a function"};
this.works.push([callee, caller]);
};
AsyncWorkManager.prototype.start = function(){
var me = this;
var arr = [];
var j = 0;
for(var i = this.works.length - 1;i >=0; i--){
var fun = function(){
var work = me.works[j++];
work[0].call(work[1],arr.pop());
};
arr.push(fun);
}
arr.pop()();
};
代码很少,但效果很好,再次写调度代码就简单了,如下。
var manager = new AsyncWorkManager();
manager.addWork(work1);
manager.addWork(work2);
manager.addWork(work3);
manager.start();
分类:
综合区
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构