函数在XMLHttpRequest之后返​​回

时间:2010-05-14 14:41:42

标签: javascript jquery xmlhttprequest

好吧,我知道这样的问题可能已被问了好几次,但我似乎找不到适合我项目的解决方案。最近,在使用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从另一个函数传递给它,而不是加载它。我也已经在那里加载了它,所以最好不要继续反复加载同一个文件。我只是担心内存过载。但是,这些文件并不是非常庞大,所以我想这可能还不错。

2 个答案:

答案 0 :(得分:1)

Ajax调用完成后,将运行$ .getJSON调用中的内联函数。在你的(回调)功能中做你的工作。

答案 1 :(得分:0)

您的check_form函数应该接受回调,以便稍后提供信息时执行。

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
    }
});