异步JS框架的作用以及实现方法


Posted in Javascript onOctober 29, 2015

从异步JS的重要性开始说起,再引入异步js框架,一步步的深入了解异步JS。

1.异步JS的重要性
随着Web平台地位的提升,霸占着浏览器的JavaScript语言也成为了世界上最流行的语言之一,甚至通过Node.js进入了服务器编程领域。JavaScript的一个重要特性便是“不能阻塞”,这里的“不能”是指“不应该”而不是“无法”的意思(只要提供阻塞的API)。

JavaScript是一门单线程语言,因此一旦有某个API阻塞了当前线程,就相当于阻塞了整个程序,所以“异步”在JavaScript编程中占有很重要的地位。异步编程对程序执行效果的好处这里就不多谈了,但是异步编程对于开发者来说十分麻烦,它会将程序逻辑拆分地支离破碎,语义完全丢失。

你是不是也曾因为ajax异步,只能在回调函数里嵌套逻辑而发狂?这样的代码看起来非常糟糕。如果使用同步,代码可以不用嵌套。但如果请求时间过长,又会因为线程阻塞,导致浏览器假死。真是非常苦恼。看来优雅的代码和良好的用户体验不能兼得了。

2.异步JS框架登场
假如现在有3个ajax请求,分别为A,B,C。A执行完后才能执行B,B执行完后才能执行C。这样我们就不得不嵌套了,在A的回调函数里执行B,然后在B的回调函数里执行C。这样的代码非常不友好。
本着‘专业造轮子'的原则,我的异步JS框架出发了!
大致结构-  

var js = new AsyncJs();
      var func = js.Build(function () {
        var a = _$Async({
          url: "",
          success: function () {

          }
        });
        var b = _$Async({
          url: "",
          success: function () {

          }
        });
        var c = _$Async({
          url: "",
          success: function () {

          }
        });
      });


eval(func);

a,b,c会按顺序执行,且线程不会阻塞。

优势
1.良好的体验。全程异步,线程不会阻塞。
2.代码优雅。不需要复杂的嵌套,框架帮你自动完成嵌套工作,你只需要关注编码本身,易于维护。
3.简单易用。build(function(){ }) 你可以理解成C#的Thread,我开多一个线程去执行function(){}  (JS是单线程的,这点要强调下!) 

new Thread(() =>
      {
        //dosomething
      });

4.简单易扩展。(请将所有要执行的方法用_$Async‘包住')
5.易于调试。
缺点
1.build(function(){ }),函数内不支持自定义局部变量,如var a=1;
 如果想使用局部变量,只能:

         var a = _$Async(function () {
          return 1;
        });

2._$Async();必须要以‘;'结尾。
3.build(function(){ }) 函数内不能直接调用外部函数,如

function Test() {
      var TestMethod = function () {
        alert(1);
      };
      var func = js.Build(function () {
        TestMethod();
      });
    }

请使用 

function Test() {
      var TestMethod = function () {
        alert(1);
      };
      var func = js.Build(function () {
        _$Async(function () {
          TestMethod();
        });
      });
    }

也许大家会好奇,到底如何实现的?又或者为什么不将eval(r)封装起来?

实现原理其实就是分析Build内的函数,然后将它动态的组合、嵌套起来,然后执行。至于eval不封装起来的原因是如果封装起来,将无法使用外部变量,因此必须将它放出来。 

 3.测试代码及效果

<head runat="server">
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title></title>
  <script src="jquery-1.8.2.min.js"></script>
  <script src="AsyncJavaScript.js"></script>
  <script>
    function Show() {
      var js = new AsyncJs();
      var url = "WebForm1.aspx";
      var func = js.Build(function () {
        _$Async(function () {
          alert("点击后开始第一次ajax请求");
        });
        _$Async({
          url: url,
          data: { val: "第一次ajax请求" },
          success: function (data) {
            alert("第一次请求结束,结果:" + data);
          }
        });
        _$Async(function () {
          alert("点击后开始第二次ajax请求");
        });
        var result = _$Async({
          url: url,
          data: { val: "第二次ajax请求" },
          success: function (data) {
            return data;
          }
        });
        _$Async(function () {
          alert("第二次请求结束,结果:" + result);
        });

      });
      eval(func);
    }
  </script>
</head>
<body>
  <form id="form1" runat="server">
    <div>
      <input type="button" onclick="Show()" value="查询" />
      <input type="text" />
    </div>
  </form>
</body>
</html>

后台C#代码

 

protected void Page_Load(object sender, EventArgs e)
    {
      string val = Request.QueryString["val"];
      if (!string.IsNullOrEmpty(val))
      {
        Thread.Sleep(2000);
        Response.Write(val + "返回结果");
        Response.End();
      }
    }

效果图:

异步JS框架的作用以及实现方法

可以看到完全是按顺序执行,并且线程无阻塞。

以上就是介绍了异步JS框架的作用以及实现方法,希望对大家的学习有所帮助,真正理解异步js的重要性。

Javascript 相关文章推荐
javascript TextArea动态显示剩余字符
Oct 22 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
Mar 17 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
Sep 02 Javascript
JavaScript中Math对象方法使用概述
Jan 02 Javascript
js日期范围初始化得到前一个月日期的方法
May 05 Javascript
javascript实现将文件保存到本地方法汇总
Jul 26 Javascript
浅谈js中对象的使用
Aug 11 Javascript
原生js实现倒计时功能(多种格式调用)
Jan 12 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
Mar 25 Javascript
js捆绑TypeScript声明文件的方法教程
Apr 13 Javascript
Vue开发中遇到的跨域问题及解决方法
Feb 11 Javascript
js实现磁性吸附的示例
Oct 26 Javascript
图解JavaScript中的this关键字
May 28 #Javascript
jquery validate demo 基础
Oct 29 #Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
Oct 29 #Javascript
jquery实现的伪分页效果代码
Oct 29 #Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
Oct 29 #Javascript
jquery实现模拟百分比进度条渐变效果代码
Oct 29 #Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
Oct 29 #Javascript
You might like
业余方法DIY电子管FM收音机
2021/03/02 无线电
用 PHP5 轻松解析 XML
2006/12/04 PHP
php+mysql分页代码详解
2008/03/27 PHP
php遍历目录viewDir函数
2009/12/15 PHP
yii用户注册表单验证实例
2015/12/26 PHP
Laravel日志用法详解
2016/10/09 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
jQuery 名称冲突的解决方法
2011/04/08 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
2015/10/19 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
JS控制HTML元素的显示和隐藏的两种方法
2016/09/27 Javascript
jQuery实现字符串全部替换的方法
2016/12/12 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
[40:29]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第一场
2018/04/10 DOTA
python实现机器学习之元线性回归
2018/09/06 Python
python绘制直方图和密度图的实例
2019/07/08 Python
python障碍式期权定价公式
2019/07/19 Python
python opencv实现信用卡的数字识别
2020/01/12 Python
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
护士自我鉴定怎么写
2014/02/07 职场文书
公司委托书范本5篇
2014/09/20 职场文书
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
JavaScript实现登录窗体
2021/06/22 Javascript
使用 CSS 轻松实现一些高频出现的奇形怪状按钮
2021/12/06 HTML / CSS