【问题标题】:Javascript: hold vars value before changingJavascript:在更改之前保留 vars 值
【发布时间】:2014-04-28 13:55:33
【问题描述】:

我有这样的事情:

for(k in array){
 var importantData = array[k];

  $.post('user/list',{name:importantData.username},function(data){
      console.log('UID of '+importantData.username+' is:'+data.id);
  });
}

问题在于“importantData” var,当我在 post 回调中使用它时,它始终是最后一个值,所以我得到类似:

米歇尔的 UID 是 11

米歇尔的UID是6

米歇尔的 UID 是 23

¿如何封装该var以获取每个案例的真实数据?

【问题讨论】:

标签: javascript for-loop callback asynccallback


【解决方案1】:

您可以为每次迭代创建一个范围并处理此问题。一个简单的例子可以是这样的:

for (var i =0; i<10 ; i++){
    (function(j){             
         $.get('https://stackoverflow.com',function(){
           console.log("I am from callback with the value of j ",j);
         })

     })(i);
}

更新了将参数传递给 IIFE 的代码示例。

【讨论】:

  • 请使用OP发布的代码示例,而不是一些人为的无关示例。此外,最好将封闭变量作为 IEFE 的参数。
  • @Bergi 感谢您对最佳实践的观察。更新代码 sn -p
【解决方案2】:

使用$.ajax方法并设置context参数:

for(k in array) {
    var username = array[k].username;
    $.ajax({
        url: 'user/list',
        type: 'POST',
        data: { name: username },
        context: username,
        success: function(result) {
            // Here "this" will be the value you passed as context
            console.log('UID of '+ this + ' is:' + result.id);
        }
    });
  });
}

【讨论】:

  • 不是这样的,不。上下文应该是一个对象(即使原始值在 ES5 中确实有效)。
  • @Bergi,再次阅读问题。现在阅读答案。以及$.ajax函数的文档和context参数的含义。
  • 再读一遍我会发现什么?我知道问题是什么(请参阅链接的副本)。解决方案是创建一个闭包。使用可以提供给$.ajax 的上下文也可以,但this 值通常应该是对象。
  • @Bergi,您似乎完全误解了我的回答。您似乎还缺少一些关于 jQuery 库、$.ajax 函数和 context 参数的含义的知识,这将解决这个特定场景中 OP 的问题。
  • @Bergi,你明白context参数的含义吗?如果不指定 context 参数,您是否了解 success 回调中的 this 是什么?从您的 cmets 看来,您显然没有。因此,我邀请您阅读文档并更好地熟悉自己,然后再如此快速地评论和否决答案。
猜你喜欢
  • 1970-01-01
  • 2021-01-12
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
相关资源
最近更新 更多