I've constructed a demo that randomizes promises. It build an array of promises that would resolve 1 to 100. Then shuffle this array, and get results. It works, and we can see it outputs in an random order. (fiddle)
var promises = [];
for (var i = 0; i < 100; i++) {
promises.push(new Promise(function(resolve, reject) {
resolve(i);
}));
}
// http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array
function shuffle(array) {
var currentIndex = array.length,
temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
shuffle(promises).forEach(function(r) {
r.then(function(v) {
$('#out').append('<div>'+v+'</div>')
})
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="out">
</div>
However, when I incorporate ajax in the promise, the result is no longer random. The output is sometimes out of order, but mostly in ascending order. The part that is different from the previous demo is in building the array of promises. fiddle
var promises = [];
for (var i = 0; i < 100; i++) {
promises.push(new Promise(function(resolve, reject) {
$.ajax({
url: '/echo/json/',
data: { json: JSON.stringify({"v": i}) },
method: 'POST',
success: function(rs) {
resolve(rs.v);
}
});
}));
}
Why?