在AJAX API调用之间等待时保持输出顺序

时间:2016-04-24 21:51:28

标签: javascript jquery ajax delay

我有一个jQuery脚本调用Web API来获取JSON格式的输出。 API适用于少量连续呼叫。我需要从API中获取更多的数据,但我不想手动发送少量数据,因为这需要很长时间。

我不在乎脚本运行需要多长时间,只要人们不需要手动执行某些操作即可。所以我加了一些延迟。问题是结果现在不按照我发送给API的顺序,所以我不能将输出与输入连接。

如何保持textareaElem中的行顺序与输入对齐?

var time = 0;
for (var i = 0; i < value_array.length; i++) {
  if (i > 0 && i % 5 == 0) {
    time = Math.floor((Math.random() * 45) + 15) * 1000; // Random waiting
  } else {
    time = 0;
  }

  (function (textareaElem, value_array, i) {
    window.setTimeout(function() {
      $.getJSON("myscript.php?var="+encodeURIComponent(value_array[i]), function(result) {
        textareaElem.val(textareaElem.val() + (result['val'] + '\n');
      });
    }, time);
  })(textareaElem, value_array, i);
}

编辑:我的代码中有错误。我需要脚本来暂停API调用一段时间。上面的代码只会在处理其他行时延迟某些行的处理。这是因为setTimeout()是异步的。

这也引入了订单问题。排序可以通过@Rodrigo Juarez的答案来解决,但它不会帮助解决整个问题,因为我需要每隔几次调用就暂停API调用。

如何进行暂停?

2 个答案:

答案 0 :(得分:1)

这是我找到的解决方案,只是创建和数组,你已经有了每个请求的索引,所以你只需要将数组中的值分配给每个结果,然后使用方法join

 var time = 0;
var text = [];
var index = 0;

//function to be called to retrieve the data
var getData = function (index) {
      $.getJSON("myscript.php?var="+encodeURIComponent(value_array[index]), function(result) { 
        text[index] = result.val + '\n';
        textareaElem.val(text.join(""));
        if (index < value_array.length){
          getData(index++);
        }
    });
};

//Just calling the function with index 0
if (value_array.length) {
  getData(0);
}

Link to the code

答案 1 :(得分:0)

尝试将结果推送到对象中包含i的数组,当结果.length等于value_array .length时,根据i对存储的数组进行排序,然后设置.val()

textareaElem
var time = 0, order = [];
for (var i = 0; i < value_array.length; i++) {
  if (i > 0 && i % 5 == 0) {
    time = Math.floor((Math.random() * 45) + 15) * 1000; // Random waiting
  } else {
    time = 0;
  }

  (function (textareaElem, value_array, i) {
    window.setTimeout(function() {
      $.getJSON("myscript.php?var="+encodeURIComponent(value_array[i])
      , function(result) {
        var curr = {index:i, value: result['val'] + '\n'};
        order.push(curr);
        if (order.length === value_array.length) {
          order.sort(function(a, b) {
             return a.index - b.index
          });
          textareaElem.val(order.join(""))
        }
      });
    }, time);
  })(textareaElem, value_array, i);
}