Javascript 如何在循环内将变量传递给ajax.done()?

Javascript 如何在循环内将变量传递给ajax.done()?,javascript,jquery,ajax,asynchronous,Javascript,Jquery,Ajax,Asynchronous,我想将一个变量传递给在循环中发生的ajax调用的.done()。这是我的原始代码: $('.list').children(“.item”).toArray().forEach( 项目=>{ $item=$(item) $id=$item.data(“userId”) $itemID=$item.attr('id')) $.ajax({ url:“https://jsonplaceholder.typicode.com/users", 数据:{“id”:$id}, }).done(res=>{

我想将一个变量传递给在循环中发生的ajax调用的.done()。这是我的原始代码:


$('.list').children(“.item”).toArray().forEach(
项目=>{
$item=$(item)
$id=$item.data(“userId”)
$itemID=$item.attr('id'))
$.ajax({
url:“https://jsonplaceholder.typicode.com/users",
数据:{“id”:$id},
}).done(res=>{
console.log($itemID)
});
}
);         
item4
项目4
项目4
项目4
当我期望看到(以任何顺序):

item1
项目2
项目3
项目4
我发现这两种解决方案都不起作用:

第一个使用立即调用的函数表达式:

。完成(
((结果)=>{
console.log(结果)
console.log($itemID)
})(res)
);
ReferenceError:未定义res
第二个使用自定义ajax参数:

$.ajax({
url:“https://jsonplaceholder.typicode.com/users",
数据:{“id”:$id},
自定义:$itemID
//与custom:{customID:$itemID}的结果相同
}).done(res=>{
console.log(res)
console.log(this.cutsom)
//与console.log($itemID)的输出相同
//console.log(this.$itemID)
});
item4
未定义
项目4
未定义
项目4
未定义
项目4
未定义

我找到了其他也不起作用的解决方案(主要使用不推荐的
success
属性)。如果我错过了一个明显的答案,很抱歉,我已经尽力了。

看起来像是范围问题。您需要将
$item
$id
$itemId
的范围限制为foreach函数

var $item = $(item);
var $id = $item.data("userId");
var $itemID = $item.attr('id');

否则,
$itemID=…
的最后一次调用将在异步ajax函数完成时保存您的最后一个id

编写所需代码的最佳方法是将.ajax方法放入如下函数中。这样,您将定义变量的作用域

函数请求($id,$itemID){
$.ajax({
url:“https://jsonplaceholder.typicode.com/users",
数据:{“id”:$id},
}).done(res=>{
console.log($itemID)
});
}
$('.list').children(“.item”).toArray().forEach(
项目=>{
$item=$(item)
$id=$item.data(“userId”)
$itemID=$item.attr('id'))
请求($id,$itemID);
}
); 


不要使用全局变量!当您执行
$itemID=somValue
时,它与
窗口相同。$itemID=somValue
并将覆盖我在代码笔中试验的每个循环,我认为这无关紧要,因为没有人会阅读此代码。。。我想这是一个教训……如果不正确声明变量,可能会变成一个坏习惯,并且会产生像这样的副作用,这些副作用很难调试,也不太明显。认为这是一个很好的教训!您仍然在使用全局变量,这是OP问题的根源。添加的函数创建了一个新的闭包,但是使用带有作用域变量的
forEach
闭包也可以解决这个问题。不过,我确实喜欢在自己的函数中隔离ajax,谢谢!我觉得自己太笨了,我忘了添加
let
>。