web前端|js教程
javascript,管理器,js
web前端-js教程
基于浏览器的事件轮询机制(以及Node.js中的事件轮询机制),JavaScript常常会运行在异步环境中。由于JavaScript本身语言的特性(不需要程序员操控线程/进程),在js中解决异步化编程的方法就显得相当重要。可以说一个完整的项目中,js开发人员是不可能不面对异步操作的。
asp无刷新提交源码,ubuntu 原ip不通,tomcat 5下载,腾讯漫画 爬虫,php游戏任务在哪里,seo美金lzw
一.回调函数
knx源码,ubuntu查看系统架构,爬虫所需网页知识,,遂川seo公司lzw
(1)经典回调函数方式:嵌套内联函数
初聊源码,vscode不能访问网络,ubuntu挂起后怎么唤醒,tomcat 配置 详解,sqlite查看所有表,网页设计 ,清空db2数据库,沈阳服务器托管,wordpress公告插件,rpc框架有前端吗,网络爬虫流程,php回车,宝安seo,静态springboot,h1标签怎么样,仿团购网站模板,易语言读取网页代码,便利100 模板 2.0,知了网站后台,h5移动端页面上下滚动条,快递公司信息管理系统,微信签到墙程序lzw
假设我们有一个ajax()方法,他接收一个url参数,向该地址发起一个异步请求,在请求结束时执行第二个参数—一个回调函数:
ajax(url,function(result){ console.log(result);});
可以说这种方式几乎是每个前端开发人员都用过的回调函数方式,有了这样的回调机制,开发人员就不用编写类似下面这样的代码来推测服务器请求什么时候返回:
var result=ajax(url);setTimeout(function(result){ console.log(result);},400);
大家应该能明白我此处想表达的意思。我们设置了一个延迟400毫秒的定时器,来假设我们发出的ajax请求会在400毫秒之内完成。否则,我们将会操作一个undefined的result。
但是有一个问题随着项目的扩大渐渐浮现出来:如果场景需要我们多层嵌套回调函数,代码将变得难以阅读和维护:
ajax(url0,function(result0){ ajax(result0.url1,function(result1){ ajax(result1.url2,function(result2){ console.log(result2); }); });});
(2)调用外部函数
为了解决内联回调函数暴露出来的代码混乱问题,我们引入外部函数调用来解决类似问题:
function handle2(result){ console.log(result);}function handle1(result){ ajax(result.url,function(result){ handle2(result); });}ajax(url,function(result){ handle1(result);});
通过这种拆分内联函数,来调用外部函数的优化方法,能极大的保持代码的简洁性。
二.制定回调管理器
观察流行的JavaScript流程控制工具,例如Nimble、Step、Seq,我们会学习到一种简洁的设计模式:通过回调管理器来控制异步JavaScript执行流程,下面是一个典型的回调管理器的关键代码示例:
var Flow={};//设置next方法,在上一个方法完成时调用下一个方法Flow.next=function(){ if(this.stack[0]){ //弹出方法栈中的第一个方法,并执行他 this.stack.shift()(); }};//设置series方法,接收一个函数数组,并按序执行Flow.series=function(arr){ this.stack=arr; this.next();};//通过Flow.series我们能够控制传入的函数的执行顺序Flow.series([ function(){ //do something console.log(1); Flow.next(); }, function(next){ //do something console.log(2); Flow.next(); }]);
我们初始化了一个Flow控制器,为他设计了series和next两个函数属性。在我们编写的业务方法内部,在方法结尾处通过调用Flow.next()的方式来顺序触发下一个方法;通过执行series方法来顺序执行异步函数。这种通过核心控制器来管理异步函数调用的方式简化了我们的编程过程,让开发人员能够投入更多精力在业务逻辑上。