我正在制作ajax请求并使用成功数据。问题是接收请求的URL一次只能使用一个单词。因此,如果发送的查询包含空格,则会中断。
如何检查传入的查询,并为每个单词发送单独的ajax请求(如果它包含多个单词),然后使用两者的数据?
function get_syn(query) {
var words = query.split(' ',2); // this is how I'm splitting it up. 2 words max
jQuery.each(words, function(index, item) { // I'm using each to loop through the words
$.ajax({
type: 'GET',
url: 'http://www.example.com?query='+item,
success: function (data) {
// do some stuff with the results...
} // end success function
}); // end ajax
}); // end for each words
// outside of the each loop, I can not access the data
} // end function
问题是我需要同时使用两个单词中的数据。我弄清楚如何做到这一点的唯一方法是使用async
,但有另一种方式:
$.ajax({
type: 'GET',
async: false,
url: 'http://www.example.com?query='+item,
success: function (data) {
var json = $.parseJSON(data);
if (index == 0) { // first word
firstword_data = json.data['array'];
} else { // if second word (there will only be a max of 2)
secondword_data = json.data['array'];
testfx(firstword_data);
} // end if second index
} // end success function
}); // end ajax
}); // end for each words
alert(firstword_data); // this works
} // end function
答案 0 :(得分:1)
由于JavaScript中的函数是first class objects,因此您可以在实际处理数据的函数中累积各个AJAX调用的结果。例如,您可以尝试:
function get_syn(query) {
var words = query.split(' '); // Split the query, now works with more than 2 words
function doStuff(result_index, data) {
doStuff.results[result_index] = data;
doStuff.num_results++;
if(doStuff.num_results == doStuff.num_query_items) {
results = doStuff.results.join(" ");
// process the data from all words
}
}
doStuff.results = [];
doStuff.num_results = 0;
doStuff.num_query_items = words.length;
jQuery.each(words, function(index, item) { // I'm using each to loop through the words
$.ajax({
type: 'GET',
url: 'http://www.example.com?query='+item,
success: function (data) {
doStuff(index, data);
} // end success function
}); // end ajax
}); // end for each words
// outside of the each loop, I can not access the data
} // end function
请注意,doStuff
函数包含的结果数组每次调用get_syn
时都会“重置”。此外,此方法保留结果中实际查询元素的顺序,因此即使第一个单词由于某种原因需要更长时间返回,它仍然作为doStuff.results
中的第一个元素输入。