Fra*_*rez 1 javascript queue ajax jquery promise
我需要进行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');
}
});
}
};
Run Code Online (Sandbox Code Playgroud)
您需要根据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]);
}
});
};
Run Code Online (Sandbox Code Playgroud)