Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数在XMLHttpRequest之后返回_Javascript_Jquery_Xmlhttprequest - Fatal编程技术网

Javascript 函数在XMLHttpRequest之后返回

Javascript 函数在XMLHttpRequest之后返回,javascript,jquery,xmlhttprequest,Javascript,Jquery,Xmlhttprequest,好吧,我知道像这样的问题可能已经被问了几十次了,但我似乎找不到一个适合我的项目的有效解决方案。最近,在使用jQuery进行大量AJAX调用时,我发现自己陷入了一种回调地狱的形式。jQuery对于这个项目是否太强大超出了这个问题的范围。基本上这里有一些代码显示了发生了什么: function check_form(table) { var file = "/models/"+table+".json"; var errs = {}; var xhr = $.getJSON(file,

好吧,我知道像这样的问题可能已经被问了几十次了,但我似乎找不到一个适合我的项目的有效解决方案。最近,在使用jQuery进行大量AJAX调用时,我发现自己陷入了一种回调地狱的形式。jQuery对于这个项目是否太强大超出了这个问题的范围。基本上这里有一些代码显示了发生了什么:

function check_form(table)
{
  var file = "/models/"+table+".json";
  var errs = {};

  var xhr = $.getJSON(file, function(json)
  {
    for (key in json)
    {
      var k = key;
      var r = json[k];
      $.extend(errs, check_item("#"+k,r));
    }
  });
  return errs;
}
而且。。。正如你可能猜到的,我得到了一个返回的空对象。我最初的想法是使用某种
onReadyStateChange
想法,只要
readyState
最终达到4,就会返回这个想法。但这会导致我的应用程序无限期挂起。我需要这些错误来决定是否允许提交表单(以及告诉用户应用程序中的错误所在)。有什么想法吗


编辑。这不是最漂亮的解决方案,但我已经设法让它工作起来了。基本上,check_form将json从另一个函数传递给它,而不是加载它。我也已经在那里加载了它,所以可能最好不要继续一遍又一遍地加载同一个文件。我只是担心重载内存。不过,这些文件不是绝对大的,所以我想这可能没问题。

在Ajax调用完成后,$.getJSON调用中的内联函数将运行。请在其中执行您的工作(回调)函数。

您的
检查表单
函数应接受回调,以便在以后信息可用时执行

function check_form(table, callback)
{
  var file = "/models/"+table+".json";
  var xhr = $.getJSON(file, function(json)
  {
    var errs = {};
    for (key in json)
    {
      var k = key;
      var r = json[k];
      $.extend(errs, check_item("#"+k,r));
    }
    callback(errs);
  });
}
然后,让check_form的呼叫者提供回调:

var table = getSomeTable();
check_form(table, function(errs)
{
    for (var key in errs)
    {
        var value = errs[k];
        // do something with key/value pair
    }
});

这将起作用,除了我最终必须将true或false返回给submit处理程序。check_form由另一个返回
return(countProps(errs)==0)的函数调用?true:false;
需要从这个函数中提供数据,除非我完全遗漏了什么。你不能这样做,因为JavaScript本质上是事件驱动的。没有睡眠/等待函数,所以你不能暂停当前运行的代码。你应该试着重新思考逻辑。嗯,我看看我能想出什么我想我需要用一个不同的想法回到绘图板上。这个想法似乎也很有效。:P