Javascript 带回调函数的AJAX

Javascript 带回调函数的AJAX,javascript,jquery,ajax,asynchronous,dhtml,Javascript,Jquery,Ajax,Asynchronous,Dhtml,如何使异步函数停止并等待响应? 我得到了一些关于从异步函数中获取值的解决方案,但是,如果我们必须将一些值传递给函数,那么如何从异步函数中获取值,我还有更多的问题 function getVal(param,callbackFunc) { a = function() { if(a.state==finished) callbackFunc(a.response); }; } 在这里,我有3个函数。首先,异步函数 fu

如何使异步函数停止并等待响应? 我得到了一些关于从异步函数中获取值的解决方案,但是,如果我们必须将一些值传递给函数,那么如何从异步函数中获取值,我还有更多的问题

 function getVal(param,callbackFunc)
 {
     a = function()
     {
       if(a.state==finished)
             callbackFunc(a.response);
     };
 }
在这里,我有3个函数。首先,异步函数

 function getVal(param,callbackFunc)
 {
     a = function()
     {
       if(a.state==finished)
             callbackFunc(a.response);
     };
 }
这是回调函数

 handler(result)
 {
    return result;
 }
这就是我调用异步函数的地方,也是我遇到问题的地方

function core()
{
  for(var i = 0 ; i < 10 ; i ++)
  {
    getVal(g[i],handler);
  }
}
函数核心()
{
对于(变量i=0;i<10;i++)
{
getVal(g[i],handler);
}
}
如您所见,我发送给getVal函数的参数是一个数组。因此,问题是如何使getVal函数同步执行参数

这总是给我数组最后一个成员的结果(函数似乎跳过了从g[0]到g[9]的所有值。它总是返回getVal(g[10],handler)的值)

请帮忙


谢谢。

一种方法是使ajax请求同步

var xhr =new XMLHttpRequest();
xhr.open("GET","url", false);
这里的False将确保在未得到响应之前不会运行其余代码


否则,我要做的就是让所有异步请求在每次响应时从array.length中减去1,然后检查它是否为零。如果是,则意味着我们已经得到了所有响应,然后调用回调。

您的问题与Ajax没有直接关系,只要代码块的执行被延迟,就会发生问题。下面的代码段使用计时器再现了这种情况。最后一个代码片段是您的问题的可能解决方案。顺便说一句,如果您仍然对Ajax感到困惑,下面是一个使其易于理解的尝试:


无延迟:
i
立即打印

print('loop start');
对于(变量i=0;i<3;i++){
印刷品(一);
}
打印(“循环结束”);
函数打印(html){
document.body.innerHTML+=html+'
';
}
我觉得您的脚本中缺少了一些重要的内容,以便我们能够理解您的问题,但我想您正在寻找的解决方案是好的,如果您仔细阅读链接的问题,您会发现您无法返回异步调用的响应。这是并发模型的固有部分。您只能回复承诺或接受回访。如果您使用ES2016 async/await语法,您可以接近,生成器也不错,但仅此而已。如果我将异步函数分离为一个类,并调用一个实例而不是直接调用该函数,会怎么样?您的问题相当于“给我一个一直违法但不是罪犯的人”。不等待返回值是异步定义的一部分。@JaredSmith:答案是“一个政客”。尝试解决方案后得到警告!!!“主线程上的同步XMLHttpRequest已被弃用,因为它会对最终用户的体验产生有害影响。有关更多帮助,请查看。”是的,它说这不是一个好做法。所以出于哪些原因,我也认为最好创建一个变量,比如Left,然后使它等于数组的长度。然后每次你从中得到负1的响应。在每次响应时,还要检查它是否为Left==0,如果为Left==0,那么您就知道您已经完成了