我有一个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调用。
如何进行暂停?
答案 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);
}
答案 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);
}