Reputation: 2024
I have to make a series of Ajax requests on a loop. Around 100 of them. And each request returns a JSONP variable. I extract data from the JSON and keep appending the value into a div. The problem is that I want the div to be appended with data in the order of function call. i.e sequentially. Now i get a different order everytime i refresh the page depending on the order in which the request completes. Here's my code.
$.each(elem, function (index, item) {
$.ajax({
type: 'post' ,
url: moviesSearchUrl + '&q=' + encodeURI(item) + '&page_limit=1',
dataType: "jsonp",
async: false,
success: searchCallback
});
function searchCallback(data) {
var movies = data.movies;
var markup = index + ': '+ movies[0].title + '<img class=" bord" src="' + movies[0].posters.thumbnail + '" /><br/>';
$("div.content").append(markup);
}
});
});
As i am displaying the value of the index inside the div, everytime i get random orders . 2 4 3 1 7 sometimes and 1 5 2 7 4 sometimes. I even tries async: false . That doesnt help. I read somewhere that JSONP cannot be done with async: false . Please help me out.
Upvotes: 5
Views: 10534
Reputation: 5095
const j = 10;
for (let i = 1; i <= j; i++) {
// wait for the promise to resolve before advancing the for loop
await ajaxcall(i);
console.log(i);
}
}
function ajaxcall(id){
return new Promise(function(resolve, reject){
var sUrl = "https://jsonplaceholder.typicode.com/todos/"+id;
$.get(sUrl, function(data) {
alert( "Load was performed."+JSON.stringify(data));
resolve(data);
});
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button onclick="someFunction()"> Test </button>
Upvotes: 0
Reputation: 137
Don't use a for-loop. Use a recursive function:
var i = 1;
function loadNext(){
if (i < 5){
$.ajax({
type: "GET",
url: "results/result_html.php?usn="+i+"&resultType="+resultType,
dataType:"JSON",
success:function(result){
finalResult+=result;
result=result+htmlMessage;
$("#info").hide();
$("#result").html(result);
$("#usn").attr("placeholder", "Class USN");
loadNext();
}
});
i++;
}
}
Upvotes: 9
Reputation: 9449
You could use a place-holder.
$.each(elem, function (index, item) {
var $placeholder = $('<div>').appendTo("div.content");
$.ajax({
type: 'post' ,
url: moviesSearchUrl + '&q=' + encodeURI(item) + '&page_limit=1',
dataType: "jsonp",
async: false,
success: searchCallback
});
function searchCallback(data) {
var movies = data.movies;
var markup = index + ': '+ movies[0].title + '<img class=" bord" src="' + movies[0].posters.thumbnail + '" /><br/>';
$placeholder.replaceWith(markup);
}
});
});
Upvotes: 4
Reputation: 101614
Something like:
// iterate over your set
$.each(myset, function(i,e){
// placeholder div (hidden from view until it's populated)
var $placeholder = $('<div>').hide().appendTo('div.content');
// make your ajax call
$.getJSON('/link/to/resource','{date:here}',function(d){
// insert the content in to the div and re-show it
$placeholder.text(i + ': ' + d.movies[0].title).show();
});
});
Upvotes: 3