我有下面一段代码,我担心它的性能。我不确定这样循环$.ajax
是否是个好主意。有没有一种更有效的方法可以在jQueryajax中循环遍历数组?
这个代码应该做什么:
这个代码应该通过一个文本区域获取一堆URL,如果这些URL被分解成新行,那么每个URL都将是urls_ary
数组的一部分。否则,如果没有换行,并且输入的文本区域值是URL,则该值将存储在single_url
中。
现在,我需要将这些URL(或URL)发送到服务器端脚本(PHP)并处理这些链接。然而,如果数组urls_ary
是通过AJAX发送数据的数组,我需要单独发送每个URL,这导致我在for
循环中运行$.ajax
调用,我认为这是低效的。
var char_start = 10;
var index = 0;
var urls = $('textarea.remote-area');
var val_ary = [];
var urls_ary = [];
var single_url = '';
urls.keyup(function(){
if (urls.val().length >= char_start)
{
var has_lbrs = /r|n/i.test(urls.val());
if (has_lbrs) {
val_ary = urls.val().split('n');
for (var i = 0; i < val_ary.length; i++)
{
if (!validate_url(val_ary[i]))
{
continue;
}
urls_ary[i] = val_ary[i];
}
}
else
{
if (validate_url(urls.val()))
{
single_url = urls.val();
}
}
if (urls_ary.length > 0)
{
for (var i = 0; i < urls_ary.length; i++)
{
$.ajax({
// do AJAX here.
});
}
}
else
{
$.ajax({
// do AJAX here.
});
}
}
});
function validate_url(url)
{
if(/^([a-z]([a-z]|d|+|-|.)*):(//(((([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:)*@)?(([(|(v[da-f]{1,}.(([a-z]|d|-|.|_|~)|[!$&'()*+,;=]|:)+))])|((d|[1-9]d|1dd|2[0-4]d|25[0-5]).(d|[1-9]d|1dd|2[0-4]d|25[0-5]).(d|[1-9]d|1dd|2[0-4]d|25[0-5]).(d|[1-9]d|1dd|2[0-4]d|25[0-5]))|(([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=])*)(:d*)?)(/(([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:|@)*)*|(/((([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:|@)+(/(([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:|@)*)*)?)|((([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:|@)+(/(([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:|@)*)*)|((([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:|@)){0})(?((([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:|@)|[uE000-uF8FF]|/|?)*)?(#((([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(%[da-f]{2})|[!$&'()*+,;=]|:|@)|/|?)*)?$/i.test(url)){
return true;
}
return false;
}
在循环中执行$.ajax
调用并不是效率低下的部分。AJAX请求将排队等待一个可用的连接(每次只允许每个连接有一定数量的请求)。效率低下的是您正在执行多个AJAX调用。理想情况下,您可以在服务器上添加一次处理多个URL的功能,然后在客户端代码中发布一组URL,而不是执行多个请求。
因此,基本上,提高效率的唯一方法是更改服务器端代码,然后重写客户端代码应该很简单。