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

这里我说一下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。

转载于:https://www.cnblogs.com/birdshome/archive/2006/03/10/Ajax_Base.html

Ajax基石脚本异步并发调用参数传递相关推荐

  1. 异步并发利器:实际项目中使用CompletionService提升系统性能的一次实践

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 场景 随着互联网应用的深入,很多传统行业也都需要接入到互联网.我们公司也是这样,保险核心需 ...

  2. 《ASP.NET AJAX程序设计——第II卷:客户端Microsoft AJAX Library与异步通讯层》前言...

    在最近的一年以及今后的三五年内,我们有理由相信Web应用程序将受到更多开发者和用户的青睐.作为领路人Google的一系列基于Web的产品完全地颠覆了传统的网页概念,让用户甚至不敢相信基于浏览器的程序竟 ...

  3. python生成器单线程_【Python】迭代器、生成器、yield单线程异步并发实现详解

    转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...

  4. java并发调用_Java并发教程–可调用,将来

    java并发调用 从Java的第一个发行版开始,Java的美丽之处之一就是我们可以轻松编写多线程程序并将异步处理引入我们的设计中. Thread类和Runnable接口与Java的内存管理模型结合在一 ...

  5. 前台为html后台是asp在vs2012中建立什么,Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得...

    Asp.net中后台*.cs与前台JS脚本之间相互调用的几点心得 < type="text/javascript"> < type="text/java ...

  6. boost.asio无锁异步并发

    简介 给出一个不安全的情况,假设我们有一个socket用于和用户通信,用户会发送多个请求,我们处理请求需要一定的时间,同时使用异步并发的模型来处理对应的请求,即一个io_context::run会有多 ...

  7. Java异步并发和线程池

    Java异步并发和线程池 1.一条简单粗暴的路: a.使用 parallelStream可能存在的bug b. 如何正确使用 parallelStream 2.另一条路 参考1: https://we ...

  8. ajax ashx调试,asp.net——Ajax与ashx异步请求的简单案例

    Ajax与ashx异步请求的简单案例: 前台页面(aspx): function gettext() { var intxt = $("#intxt").val(); $.ajax ...

  9. js如何使浏览器允许脚本异步加载

    js如何使浏览器允许脚本异步加载 如果脚本体积很大,下载和执行的时间就会很长,因此造成浏览器堵塞,用户会感觉到浏览器"卡死"了,没有任何响应.这显然是很不好的体验,所以浏览器允许脚 ...

最新文章

  1. SCCM 2012系列之新特性概览一:SCCM 2012安装选项和控制台新界面预览
  2. 【DBMS 数据库管理系统】数据仓库 数据组织 ( 数据组织级别 | 元数据 | 粒度 | 分割 | 数据组织形式 )
  3. 万事俱备只缺你,6月亚洲消费电子展不见不散
  4. VS2010MFC - TeeChart经验总结(零基础入门到动态创建)
  5. kong 使用jwt RSA256证书
  6. 记录 Parameter with that position [1] did not exist; nested exception is java.lang.IllegalArgumentExce
  7. php atlas,apache atlas是什么
  8. 线下实战-8月24号上海
  9. Kubernetes 核心概念 1
  10. 卸载exchange后注意事项
  11. iOS 指纹识别/人脸识别登录(ECDSA 加签)
  12. 经纬度度分秒转换小数
  13. 一键安装包php.ini,laravel 在windows中使用一键安装包步骤
  14. Ubuntu打开wps文件缺少字体
  15. 在一起计时器_浅谈§1.4 实验:用打点计时器测速度
  16. 蚁群优化算法之精华蚂蚁系统和排列蚂蚁系统学习笔记
  17. 试述Linux内核启动过程,Linux内核启动过程和Bootloader(总述)
  18. Android用Canvas画钟表仪
  19. leetcode 1313. Decompress Run-Length Encoded List(python)
  20. 上线清单 —— 20 个 Laravel 应用性能优化项 1

热门文章

  1. android开机自动开启zram,低内存配置  |  Android 开源项目  |  Android Open Source Project...
  2. 优贝共享数据交易所网_2020.10.4号币圈简报:优贝兼职视界卖单积压,耀健康上涨...
  3. mysql开启权限控制_mysql开启远程访问及相关权限控制
  4. 案例:用一条 SQL 语句查询出每门课都大于 80 分的学生姓名
  5. ios kvo 要引入_腾讯社招iOS面试记录
  6. java中number类型能否相除_Java中 如果复数类成员是int型,怎么实现两个复数相除...
  7. Xctf练习sql注入--supersqli
  8. 鸿蒙明年可以在手机上用吗,华为王成录:鸿蒙已满足在手机上使用,明年一二月份向部分用户开放...
  9. c语言fopen_s的用法,fopen和fopen_s用法的比较
  10. pytorch 命令行运行_PyTorch简介与相关安装