for(var j = 0; j < tempArray.length; j ++){
$.getJSON('http://localhost:8080/predict', tempArray[j])
.fail(function(data,textStatus, error) {
Probability = data.responseText;
console.error("getJSON failed, status: " + textStatus + ", error: "+error);
})
.done(function(data) {
console.log(data);
Probability = data.classProbabilities[0];
Array.prototype.push.call(resultPercentage, Probability);
});
}
console.log(resultPercentage);
tempArray
是一个包含10个对象的数组。我正在使用for循环将该数组传递给json
resultPercentage
在一个数组中打印10个不同的结果
每当我使用for循环调用Json时,它就会不断改变该数组中结果的顺序。
答案 0 :(得分:0)
做这样的事情。注意:您无法在循环内运行函数。尝试一下,如果有效,请告诉我们。如果没有,请提供您的意图,实际上您想要做什么。
var tempArray = [];
for(var j = 0; j < tempArray.length; j++){
$.getJSON('http://localhost:8080/predict', tempArray[j])
.fail(first)
.done(second);
}
console.log(resultPercentage);
function first(data, textStatus, error) {
Probability = data.responseText;
console.error("getJSON failed, status: " + textStatus + ", error: "+error);
}
function second(data) {
console.log(data);
Probability = data.classProbabilities[0];
Array.prototype.push.call(resultPercentage, Probability);
}
答案 1 :(得分:0)
就像在评论中所说,多个ajax resquest的处理顺序几乎(我们正在谈论微秒)同时发送取决于服务器。
我不知道服务器如何管理它 但肯定,不保证会按顺序处理它们。
我只能用 theorical 建议回答...
因为我不知道http://localhost:8080/predict
做了什么
我甚至都不知道这是不是PHP
j
循环计数器作为请求id
传递
然后,我会使用Ajax Global Events来处理回复,而不是循环中的.fail()
和.done()
。for
循环缩短为:
for(var j = 0; j < tempArray.length; j ++){
$.getJSON('http://localhost:8080/predict', '{data:tempArray[j],id:j}'); // Pass the array AND an id
}
现在,在http://localhost:8080/predict
中,获取数据并完成您的工作
保持id
在json响应中重新注入它。
<?php
$data = $_REQUEST['data'];
$id = $_REQUEST['id'];
// Do your stuff with $data...
// ...
// Add the passed id to the json actually produced:
echo '{id:' . $id . ', classProbabilities:[0.90], color:"blue", somethingElse:"Other data"}';
?>
使用Ajax Global Events可以使用一些计数器 在尝试显示结果之前,确保所有请求都已完成是很有用的 即使某些请求失败,您也可以显示成功请求的结果。
// Counters.
var completed_Ajax = 0;
var error_Ajax = 0;
var success_Ajax = 0;
// An array to get the resquest response order
var responseOrder = [];
// An array to have the resquest responses reordered (final result)
var resultPercentageOrdered = [];
// Error handler
$.ajaxError(function(request, status, error){
error_Ajax++;
console.log("Error #"+error_Ajax+":\n"+error);
});
// Sucess handler
$.ajaxSuccess(function(data){
success_Ajax++;
// Handle the data (your code untouched)
console.log(data);
Probability = data.classProbabilities[0];
Array.prototype.push.call(resultPercentage, Probability);
// Push the received id in array.
responseOrder.push(data.id);
if( success_Ajax == tempArray.length ){
console.log("All resquests succeded.");
}
});
// Completed request handler
$.ajaxComplete(function(){
completed_Ajax++;
if( completed_Ajax == tempArray.length ){
console.log("All resquests done.");
}
if( (error_Ajax + success_Ajax) == tempArray.length ){ // Even if there are errors... Show results when all resquests completed.
// The result before ordering.
console.log(JSON.stringify(resultPercentage));
// Just for fun, show the resquest processing order
console.log(JSON.stringify(responseOrder));
// Reordering the results, using responseOrder
//
for(i=0;i<success_Ajax;i++){
var index = responseOrder.indexOf(i);
resultPercentageOrdered.push(resultPercentage[index]);
}
// Show them in console.
console.log(JSON.stringify(resultPercentageOrdered));
// Use this result array here.
// ...
// ...
}
});
答案 2 :(得分:0)
我有类似的问题,我做了类似的事情:
$.each( array, function( key, value ) {
$.ajax({
url: "http://localhost:8080/example",
data: JSON.stringify(value),
async:false,
success:something,
fail:something
});
});
您也可以尝试使用for循环。 async:false将阻止它异步运行。