常遇到的一种闭包情形

1 问题描述

有个问题,想把一个请求,分成多次请求完成。例如,下面的例子中,将一个时间段,拆分成10个小的时间段,分别请求数据。很自然地写出了如下代码:

for (var i = 0; i < 10; i++) {

    var dateRange = {};

    dateRange.start = start + i*deta;
    dateRange.end = start + (i+1)*deta - 1;

    Ext.Ajax.request({
        url: ajax_url,
        params: {
            start: dateRange.start,
            end: dateRange.end,
        },
        success: function (response, options) {

            ...

            // 注意此处用到闭包, i 已经变成最大值了
            conosle.log(i);

        }
    });
}

如上代码,当请求结果出来后,i 的打印值都是为 10,而对于所有用到 i 的地方(比如用来计算时间范围,都是错误的了)。

2 解决办法

2.1 提取参数

这是最直接的办法,参考文献中也提到了这种方式,但他提到了还有其他的方式实现

function requestData(i) {
    var dateRange = {};

    dateRange.start = start + i*deta;
    dateRange.end = start + (i+1)*deta - 1;

    Ext.Ajax.request({
        url: ajax_url,
        params: {
            start: dateRange.start,
            end: dateRange.end,
        },
        success: function (response, options) {

            ...

            conosle.log(i);

        }
    });
}

for (var i = 0; i < 10; i++) {
    requestData(i);
}

2.2 设定 ajax 为同步方式

设定 ajax 请求方式同步(因为 Ext 默认的是异步方式),这样阻塞了循环进行,不会出现对 i 的改写。

    Ext.Ajax.request({
        url: ajax_url,
        // 设定为同步请求方式
        async: false,
        params: {
            start: dateRange.start,
            end: dateRange.end,
        },
        success: function (response, options) {

            ...

3 参考资料

1. javascript闭包(Closure)初探

提到了闭包的基本概念(内部函数块引用外部块的变量),闭包问题描述及解决办法:创建函数,传递参数。与现场中的类似。

2. ExtJs4 笔记(3) Ext.Ajax 对ajax的支持

提到了 ExtJS 中 ajax 请求函数说明

时间: 2024-08-29 13:06:35

常遇到的一种闭包情形的相关文章

Oracle中Hint被忽略的几种常见情形

Hint可以影响优化器对于执行计划的选择,但这种影响不是强制性的,优化器在某些情况下可能会忽略目标SQL中的Hint.由于各种原因导致Hint被Oracle忽略后,Oracle并不会给出任何提示或者警告,更不会报错,目标SQL依然可以正常运行,这也符合Hint实际上是一种特殊注释的身份.注释本来就是可有可无的东西,不应该因为它的存在而而导致原先在没有Hint时可以正常执行的SQL因为加了Hint后而变得不能正常执行. 下面来看几种Hint被Oracle忽略的常见情形. 1 使用的Hint有语法或

velocity merge作为工具类从web上下文和jar加载模板的两种常见情形

很多时候,处于各种便利性或折衷或者通用性亦或是限制的原因,会借助于模板生成结果,在此介绍两种使用velocity merge的情形,第一种是和spring mvc一样,将模板放在velocityConfigurer属性指定的路径下,如: <bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <pr

js的一种闭包用法

经常忘记闭包的具体用法,写个例子给以后参考: 没用闭包: for(var i = 0; i < 100; i++){     setTimeout(function(){         console.log(i)},1000     ) } 结果1s后显示100个100 使用闭包: for(var i = 0; i < 100; i++){ (function(i){ return (function(i){ setTimeout(function(){console.log(i)},10

为什么说Java匿名内部类是残缺的闭包

前言 我们先来看一道很简单的小题: public class AnonymousDemo1 { public static void main(String args[]) { new AnonymousDemo1().play(); } private void play() { Dog dog = new Dog(); Runnable runnable = new Runnable() { public void run() { while(dog.getAge()<100) { // 过

JavaScript闭包

1.定义 指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量. 2.作用域链 向上查找,一直找到全局变量的为止.(局部(参数列表)->全局)如果查找不到则undefind. 3.几种闭包 1)简单闭包 a)函数(对象):this默认为当前对象,不带this的变量(先找局部变量,再找全局变量) 2)复杂闭包 a)函数中的函数:this默认为全局window. 不带this的变量(先找外部函数的局部变量,再找全局变量) b)函 Normal 0 7.8 磅 0 2 fa

python编程中的闭包函数

什么是闭包? 简单说,闭包就是根据不同的配置信息得到不同的结果 再来看看专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外.所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体. 看概念总是让人摸不着头脑,看几个python小例子就会了 例1 def make_adder(addend):     def adder(augend):      

border-radius几种写法的原理剖析

border-radius:40px; border-radius:40px/20px; border-radius:40px 20px; border-radius:40px 20px 10px 5px; 今天主要是测试上面四种border-radius的写法. 首先是第一种. border-radius:40px; 这里设置了一个值,所以默认4个角都显示为半径40的圆角,蓝色方框为40像素宽的正方形.所以也就是相当于圆的半径. 第二种 border-radius:40px/20px; 这里除

jquery闭包概念

//闭包:有参数的加载事件(空参数形式)(function($){ alert("123");})(jQuery); //有参数的加载事件(function($){ alert($);})(456); (function($){     $("div p").click(function(){alert("cssrain!")});})(jQuery);            //一个闭包 这里面的$只是形参,但jquery是全局变量,所以不需要

Swift:函数和闭包

函数 函数是一个完成独立任务的代码块,Swift中的函数不仅可以像C语言中的函数一样有函数的参数和返回值,而且还支持嵌套,并且有函数参数默认值.可变参数等. 1 //定义一个函数,注意参数和返回值,如果没有返回值可以不写返回值或者写成Void.空元组()(注意Void的本质就是空元组) 2 func sum(num1:Int,num2:Int)->Int{ 3 return num1 + num2 4 } 5 6 sum(1, 2) 可以看到Swift中的函数仅仅表示形式有所区别(定义类似于Ja