Ajax基石脚本异步并发调用参数传递

原创 2006年05月31日 14:22:00
        在Ajax开发框架中,最基本的划分是服务器端和客户端。服务器端相对来说比较简单,只要是可以开发动态网页的语言都可以胜任;客户端浏览器就是JScript/JavaScript的天下了,好像没有看到有VBScript做的Ajax客户端库。由于客户端依赖于脚本并运行在浏览器中,似乎比服务器端的可实现和可管理性还要差些。

  这里我说一下Ajax中的A, Asynchronous调用的一些问题。如果我们在异步调用时不为方法传递任何的参数,那么这个问题也就简单甚至不存在了。但是事实上,我们开发一些稍微复杂些的功能时,对于"脚本异步并发调用参数传递"这个功能是很需要的。说的严重些,可以把这个功能看成Ajax客户端框架能否真正Asynchronous的基石。对于异步调用参数传递的问题,可以看我以前的一篇文章"使用匿名函数为setInterval传递参数"。虽然文中的示例很好地解决了参数传递问题,但是我们看看下面的示例,看会发现什么呢?

function foo()
{
 var param = 100;
 window.setTimeout(function()
 {
  intervalRun(param);
 }, 0);
 param = 0;
}

function intervalRun(times)
{
 alert(times);
}

  我们执行foo,会得到什么样的alert结果呢?100? or 0?,答案是:0。其实写过内嵌函数就知道,这里要真确的传入100,需要这样改写foo方法:

function foo()
{
 var param = 100;
 var __param = param;
 window.setTimeout(function()
 {
  intervalRun(__param);
 }, 0);
 param = 0;
}// 这样添加一个变量来存储param就可以了,这下执行foo得到的alert结果就是:100。

  上面这个修正本身没有问题,可是如果我在并发执行的情况下,就可能又有新的问题。示例代码:

function doTick()
{
 var tick = new Date().getTime();
 var __tick = tick;
 var foo = function()
 {
  GetTick(__tick);
 };
 window.setTimeout(foo, 3000);
}

function GetTick(tick)
{
 // to do something depend on tick parameter
}

  当我们在调用doTick方法时,如果以小于3000ms的频率并发,将会导致前一次的tick变量被后面执行的执行过程修改的问题,从而导致GetTick方法取到错误的tick参数。也就是说必须把doTick方法看成一个,需要"本身执行时间+3000ms"才能运行完的方法,然后再保证并行的执行doTick方法才不会出错。这样的限制条件显然是不可接受的,那么我们该怎么办呢?

  其实我们只需要使用内嵌函数自身帮助我们传递参数就行了,修改后的示例如下:

function doTick()
{
 var tick = new Date().getTime();
 var foo = function()
 {
  var __tick = foo.params[0];
  GetTick(__tick);
 };
 foo.params = [tick];
 window.setTimeout(foo, 0);
}

  由于内嵌函数构造出一个Closure Scope,它将帮组我们保存参数的Context,使我们获得真正的"异步并发调用参数传递"效果。

  注意:Closure Scope是JScript编程中危险的高级技术,使用不当极易造成IE Memory Leak。

LoadRunner如何处理AJAX异步请求

最近在网上经常有人问“LoadRunner脚本回放成功,但数据没有写入数据库,这是什么原因”,记得以前的同事也遇到过相同的问题,再次将解决方法贴出来,希望能帮助大家。 相信大家在做测试的过程中,特...
  • jiang1986829
  • jiang1986829
  • 2015年08月26日 16:24
  • 2521

两个并行AJAX引发的业务思考?

事件的起因是:避免后台执行过慢影响页面显示效果 在页面执行ajax进入后台执行大量的算法处理和调用数据量十分大的接口时,想比会导致回调过慢或者前端页面卡死的情况,这样十分影响用户体验和网页加载,而且后...
  • dexing07
  • dexing07
  • 2016年11月17日 22:41
  • 712

jquery的几种异步请求,ajax

jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯。 废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是...
  • a5489888
  • a5489888
  • 2013年01月21日 00:55
  • 100921

js与ajax中异步调用的简单理解

function connectServer(callback) { if (window.XMLHttpRequest) { xmlhttp = new XMLHttpReq...
  • zhoutengtengsonw
  • zhoutengtengsonw
  • 2015年04月17日 00:01
  • 898

ajax中执行服务器返回的js脚本

在ajax的回调函数中,先获取js脚本的值,赋值到页面的某一个控件,比如一个div,如: document.getElementById("uccenter").innerHTML=data.u...
  • shannonlee
  • shannonlee
  • 2014年01月06日 10:40
  • 649

ajax异步调用

ajax异步调用篇: 关于ajax异步调用篇:主要讲解理清业务思路: TODO: 1,采用$.ajax,异步调用 2,其中关于异步调用获取数据,jquery精细控制对象,清空页面信息 讲解篇:1,...
  • HR1187362408
  • HR1187362408
  • 2015年06月10日 13:42
  • 1008

对Ajax同步异步的理解

这个要跟同步的概念一起理解,举个同步的例子 就是当你浏览页面的时候,你点击一个按钮或者链接,那么这个界面就会向服务器发送请求,此时你眼前的界面就是一片空白,直到请求的数据返回页面上才有东西显示。就是一...
  • qfikh
  • qfikh
  • 2016年09月14日 22:54
  • 1699

Ajax异步请求阻塞情况的解决办法

现象:在一个网站中,当访问一个处理比较耗时的页面(A页面),页面请求还没有返回时,此时再点击访问该网站的其他页面(B页面)会出现B页面很久都没有响应和返回,直到A页面输出返回数据时才开始处理B页面的请...
  • littlewrong
  • littlewrong
  • 2015年08月31日 15:18
  • 3350

聊聊java高并发系统之异步非阻塞

聊聊java高并发系统之异步非阻塞 几种调用方式 同步阻塞调用 即串行调用,响应时间为所有服务的响应时间总和; 半异步(异步Future) 线程池...
  • chenglinhust
  • chenglinhust
  • 2016年09月16日 10:51
  • 2334

异步请求 ajax的使用详解

异步交互和同步交互 要说Ajax就不得不说,异步传输和同步传输了。 异步是值:发送方发出数据后,不等接收方发回响应,接着发送下一个数据包的通讯方式。同步是指:发送方发出数据后,等待接收...
  • happyAliceYu
  • happyAliceYu
  • 2016年08月31日 08:29
  • 3793
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ajax基石脚本异步并发调用参数传递
举报原因:
原因补充:

(最多只允许输入30个字)