jQuery ajax inside a loop problem
30,870
The problem is that the anonymous callback method captures the ui_item
variable by reference. Since there is only one variable, it always gets whatever was assigned last to the variable.
You need to wrap the contents of the for
loop in a function that takes i
as a parameter, then call the function in the loop. Each call to the wrapper function will create a separate variable, solving the problem.
For example:
function doCheck(i) {
var split_values = split_files_cb_value_holder[i].split(':');
var ui_item = split_files_cb_value_holder[i];
$.ajax({
type: "POST",
url: "ds/index.php/playlist/check_folder",
data: "component_type="+$('#component_type').val()+"&value="+split_values[1],
success: function(msg)
{
console.log(ui_item); //Don't always get the last value
},
error: function()
{
alert("An error occured while updating. Try again in a while");
}
});
}
for (var i = 0; i < split_files_cb_value_holder.length; i++)
doCheck(i);
Related videos on Youtube
Author by
steamboy
Updated on January 23, 2020Comments
-
steamboy over 4 years
This js loop script always get the last value of ui_item inside a jquery ajax funciton. How can a catch the correct value of each iteration?
for (var i = 0; i <= split_files_cb_value_holder.length - 1; i++){ var split_values = split_files_cb_value_holder[i].split(':'); ui_item = split_files_cb_value_holder[i]; $.ajax({ type: "POST", url: "ds/index.php/playlist/check_folder", data: "component_type="+$('#component_type').val()+"&value="+split_values[1], success: function(msg) { console.log(ui_item); //ALWAYS GETS THE LAST VALUE }, error: function() { alert("An error occured while updating. Try again in a while"); } }); }
Thanks!
-
kamushin over 7 yearsAdd
let
before ui_item will solve this. -
Liam over 4 yearsPossible duplicate of Calling an asynchronous function within a for loop in JavaScript
-
-
awgy about 14 yearsThank you for the correction, but I feel compelled to add a small note. Sometimes tone isn't conveyed well over the internet, and to get a terse comment beginning with "WRONG" seemed harsh. But, I was glad to see your answer and appreciated the correction. +1 from me.
-
SLaks about 14 years@awgy: I'm sorry; I didn't mean to be offensive. However, seeing two identically wrong answers (and one from a >100K user), I wanted to firmly head off the misconception. (And, I'm exhausted)
-
MadushM almost 12 yearsYes that's a 'quick and dirty' fix causing browser to load slow might even interrupt loading, altogether.
-
fldsofglry over 11 yearsAs an update: async false is deprecated as of jQuery 1.8. api.jquery.com/jQuery.ajax
-
Sridhar Sarnobat about 6 yearsCan this work with an inline function (i.e. don't give a name to the helper function
doCheck()
). Colocated code has its advantages.