我在使用for循环多次调用json时遇到问题

时间:2017-07-22 01:46:42

标签: javascript jquery json ajax for-loop

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时,它就会不断改变该数组中结果的顺序。

3 个答案:

答案 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将阻止它异步运行。