for循环内异步获取数据JavaScript

Get data asynchronously JavaScript within for loop

我有这个功能

function add_cnh(arr_clelem){

  var id=arr_clelem.getElementsByClassName("present")[0].id;
  var date=arr_clelem.getElementsByClassName("present")[0].getAttribute('date');
  var tt_entry= arr_clelem.getElementsByClassName("present")[0].getAttribute('tt_entry'); 


//new Ajax.Updater('register', '/some_url', { method: 'get' });

new Ajax.Request('/attendances/new',
{
    parameters:'id='+id+'&date='+date+'&timetable_entry='+tt_entry+'&subject_id='+subject_id,
    asynchronous:true,
    evalScripts:true,
    method:'get'
 /*onSuccess: function(transport) {
var response = transport.responseText || "no response text";
alert("Success! \n\n" + response);
}*/

}
)
var ret=modal_data;
  // $$('.MB_close').invoke('observe', 'click', _deinit);
return ret;

}

此函数将 html-elements-object 作为参数并基本上呈现一个模态框,并且该模态框包含一个表单元素,我需要将其存储在数组中。变量 modal_data 包含我需要的元素及其在另一个文件中定义的全局变量。

我的问题是 这是一个使用许多 JavaScript 框架和库的非常古老的项目,可以追溯到 2006 年,可以看出,负责打开模型框本身的库已被弃用 here

而且我不想进入服务器端,所以我使用了类似这样的 for 循环

for(var i=0; i<arr_of_elements.length, i++)
{
   my_arrvar[i]=add_cnh(arr_of_elements[i]);
}

现在每次迭代,因为我希望模式框关闭并将数据存储在 'my_arrvar' 中,这在某种程度上是不可能的,因为调用本质上是异步的,我使用了闭包和回调,但没有成功。我不想使用任何类型的计时器。事情是这样的

调用函数,每次调用获取数据,通过id移除模态框。

还可以 this 以某种方式使用吗?如果使用的话如何使用?

您必须传入 ajax 请求 asynchronous:false 而不是 true。否则无法通过其他方式实现。

其他方式使用jQuery

最简单的方法是使用 .ajaxStop() 事件处理程序:

$(文档).ajax停止(函数() { // 将在最后一个未完成的 ajax 调用完成时执行的代码放在这里 });

jQuery Event handler