Javascript 将异步Ajax调用结果放入数组中
我的代码:Javascript 将异步Ajax调用结果放入数组中,javascript,jquery,ajax,asynchronous,Javascript,Jquery,Ajax,Asynchronous,我的代码: var test = getData(email, password, data.sites); console.log(test); // 4 sites, 4 responses // TODO if 4 responses, call other function function getData(email, password, sites) { var formData = createFormDataArray(email, password
var test = getData(email, password, data.sites);
console.log(test); // 4 sites, 4 responses
// TODO if 4 responses, call other function
function getData(email, password, sites) {
var formData = createFormDataArray(email, password, 0); // not so relevant
var returnValues = [];
sites.forEach(function (site) {
var url = 'http://' + site + '/test.php';
var newValue;
sendRequest(url, formData).done(function(value) {
newValue = value.status; // string
console.log(newValue);
});
returnValues.push(newValue); // add to array
});
console.log('------');
console.log(returnValues); // print array
return returnValues;
}
function sendRequest(url, formData) {
return $.ajax({
type: 'post',
url: url,
data: formData,
crossDomain: true,
dataType: 'json',
encode: true
});
}
我想在这里做的是对不同的域进行多个Ajax调用,将结果放入一个数组中
如果数组包含所有响应,我想调用另一个函数,但现在还没有
这里的问题是:调用是异步的,我喜欢“等待”直到收到所有响应,以便启动另一个函数
当前已记录:
- 空数组
- 空数组
- newValue:“好的”
- newValue:“好的”
- [“好”、“好”、“好”、“好”]
- [“好”、“好”、“好”、“好”]
var defers = [];
sites.forEach(function (site) {
var url = 'http://' + site + '/test.php';
var defer = sendRequest(url, formData);
defers.push(defer);
});
$.when.apply(window, defers).always(function() {
// the other function
});
创建一个“延迟”数组。然后,使用下面答案中的解决方案 您可以使用jQuery.when()进行多个ajax调用,并在所有xhr调用完成后执行一些函数
$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) {
// a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively.
// Each argument is an array with the following structure: [ data, statusText, jqXHR ]
var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It"
if ( /Whip It/.test( data ) ) {
alert( "We got what we came for!" );
}
});
更多细节可以找到
要将$.when()与for循环一起使用
var returnValues = [];
var deferreds = [];
sites.forEach(function (site) {
var url = 'http://' + site + '/test.php';
deferreds.push(sendRequest(url, formData));
});
$.when.apply($, deferreds).done(function(){
for(var i=0; i<arguments.length; i++)
{
returnValues.push(arguments[i].status);
}
});
var returnValues=[];
风险值递延=[];
站点。forEach(功能(站点){
var url='http://'+site+'/test.php';
推送(sendRequest(url、formData));
});
$.when.apply($,延迟).done(函数(){
对于(var i=0;i可能的重复项,您无法返回该数组,您必须添加一个在.done
方法中调用的回调。此外,在AJAX调用之后要发生的所有代码都必须添加到AJAX调用本身的成功回调(done函数)中否则,它将在AJAX调用之前发生。我知道之后的所有代码都应该在成功回调中,但我喜欢收集多个调用的响应。好的,这间接地让我找到了解决方案。请尽快更新我的帖子。@dnns,您可以使用with loop,请查看我对您的场景的其他回答。是的,谢谢,实际上找到了alr我已经准备好了。检查我的编辑。