jQuery - 使用 .getJSON 时维护 .each() 的顺序
jQuery - Maintain Order of .each() while using .getJSON
我有一个工作函数,它检查具有特定 class 名称的任何输入,然后为每个输入的值运行 getJSON 调用:
function getTopFeeds() {
if (jQuery('input.class-name').length > 0) {
jQuery.each(jQuery('input.class-name'),function(){
var feedName = jQuery(this).val();
jQuery.getJSON("https://api.url/"+feedName).success(function(data) {
if (!(data)) {
return;
}
var result = data.results[0];
if (result) {
// Here I create HTML list items to display API data
}
});
});
}
}
它可以工作,但因为它是异步的,所以它不会按页面上输入的顺序返回。如何修改我现有的函数,以便数据以与输入相同的顺序显示?
如果你想等到他们都回来了,你可以将结果保存在一个数组中,记住你看到了多少个结果;当您看到与请求一样多的结果时,您就完成了。查看评论:
function getTopFeeds() {
if (jQuery('input.class-name').length > 0) {
// Get the inputs
var inputs = jQuery('input.class-name');
// Storage for the results
var results = [];
// Counter for # of responses we've seen
var counter = 0;
// Get them
inputs.each(function(index) {
var feedName = this.value;
jQuery.getJSON("https://api.url/" + feedName)
.done(function(data) {
// Got a response, save it or null if falsy (would that really happen?)
results[index] = data ? data.results[0] : null;
})
.fail(function() {
// Error response, use null as a flag
results[index] = null;
})
.always(function() {
// Called after `done` and `fail` -- see if we're done
if (++counter === inputs.length) {
// Yes, we're done -- use the results in `results`
// Note that there will be `null`s for any that
// didn't have data
}
});
});
}
}
我有一个工作函数,它检查具有特定 class 名称的任何输入,然后为每个输入的值运行 getJSON 调用:
function getTopFeeds() {
if (jQuery('input.class-name').length > 0) {
jQuery.each(jQuery('input.class-name'),function(){
var feedName = jQuery(this).val();
jQuery.getJSON("https://api.url/"+feedName).success(function(data) {
if (!(data)) {
return;
}
var result = data.results[0];
if (result) {
// Here I create HTML list items to display API data
}
});
});
}
}
它可以工作,但因为它是异步的,所以它不会按页面上输入的顺序返回。如何修改我现有的函数,以便数据以与输入相同的顺序显示?
如果你想等到他们都回来了,你可以将结果保存在一个数组中,记住你看到了多少个结果;当您看到与请求一样多的结果时,您就完成了。查看评论:
function getTopFeeds() {
if (jQuery('input.class-name').length > 0) {
// Get the inputs
var inputs = jQuery('input.class-name');
// Storage for the results
var results = [];
// Counter for # of responses we've seen
var counter = 0;
// Get them
inputs.each(function(index) {
var feedName = this.value;
jQuery.getJSON("https://api.url/" + feedName)
.done(function(data) {
// Got a response, save it or null if falsy (would that really happen?)
results[index] = data ? data.results[0] : null;
})
.fail(function() {
// Error response, use null as a flag
results[index] = null;
})
.always(function() {
// Called after `done` and `fail` -- see if we're done
if (++counter === inputs.length) {
// Yes, we're done -- use the results in `results`
// Note that there will be `null`s for any that
// didn't have data
}
});
});
}
}