我需要进行 3 次或更少的 ajax 调用,并且需要按照请求的相同顺序将响应附加到 dom。
我有以下功能,但问题是当我得到的响应附加到 dom 时,它们的顺序不一定正确。
我不想使用 async: false 属性,因为它会阻塞 UI,当然会影响性能。
mod.getArticles = function( ){
//mod.vars.ajaxCount could start at 0-2
for( var i = mod.vars.ajaxCount; i < 3; i++ ){
//mod.vars.pushIds is an array with the ids to be ajaxed in
var id = mod.vars.pushIds[i];
$.ajax({
url: '/ajax/article/' + id + '/',
type: "GET",
dataType: 'HTML',
error: function() {
console.error('get article ajax error');
}
}).done( function( data ) {
if (data.length) {
mod.appendArticle( data );
} else {
console.error('get article ajax output error');
}
});
}
};
最佳答案
您需要将文章附加到某个位置,例如,基于您拥有的 i
变量。或者您可以等待所有请求,然后按顺序附加它们。像这样:
mod.getArticles = function( ){
var load = function( id ) {
return $.ajax({
url: '/ajax/article/' + id + '/',
type: "GET",
dataType: 'HTML',
error: function() {
console.error('get article ajax error');
});
};
var onDone = function( data ) {
if (data.length) {
mod.appendArticle( data );
} else {
console.error('get article ajax output error');
}
};
var requests = [];
for( var i = mod.vars.ajaxCount; i < 3; i++ ){
requests.push(load(mod.vars.pushIds[i]));
}
$.when.apply(this, requests).done(function() {
var results = requests.length > 1 ? arguments : [arguments];
for( var i = 0; i < results.length; i++ ){
onDone(results[i][0]);
}
});
};
关于javascript - 循环内的 Ajax 调用需要顺序响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29858388/