jQuery问题(a)同步方法调用

时间:2011-06-29 13:42:55

标签: ajax jquery asynchronous synchronous

我有一个奇怪的行为,看起来lika是(a)同步方法调用的问题?!​​? 我不确定! 函数使用getJSON接收数据,对这些数据进行后处理,将它们添加到表中,该表可以通过table-sorter插件(http://tablesorter.com/)进行排序。

这里是代码的一些部分。函数通过getJSON接收数据:

jQuery.getJSON(url,{},function(data)
              {
             success:{ ....

在成功块中,数据将在for-each循环中处理。在for-each循环期间,每个JSON元素都将被操作(doSomething())并添加到HTML表中:

success:{ [some-code]
          $.each (data.words, function (i,n) 
                              {result=doSomething(n);
                               obj=jQuery('#Template').clone().appendTo('#table');
                               obj.html(result);
                              }

最后,在那之后我必须更新Table-sorter -extension并开始一个新的排序:

         jQuery("#table").trigger("update");
         $("#table").trigger("sorton",[[[1,1]]]);
}; //end of "success

此代码已简化。问题是,$("#table").trigger("sorton",[[[1,1]]]);只能正常工作,如果我启动此功能延迟setTimeout('$("#trends").trigger("sorton",[[[1,1]]]);',20);

我认为输出obj.html(result);将是异步的。因此,如果我在没有setTimeout的情况下启动分拣机功能,分拣机功能在运行时就找不到数据。

有没有办法让成功阻止线性?

谢谢,任何帮助!!

2 个答案:

答案 0 :(得分:2)

如果您查看tablesorter的源代码,则update事件中包含setTimeout,这很可能会影响您对表进行排序的调用。

$this.bind("update", function () {
    var me = this;
    setTimeout(function () {
    // rebuild parsers.
        me.config.parsers = buildParserCache(
        me, $headers);
        // rebuild the cache map
        cache = buildCache(me);
    }, 1);

完整的黑客将你的排序添加到该代码块的末尾。一个更优雅的解决方案,我不确定我能提供,但我想与你分享这个发现。

答案 1 :(得分:0)

我认为你或多或少解决了自己的问题。完成所有成功:函数中的回调代码,并在success属性中指定该函数。 getJSON()调用是异步的,所以当它完成时,需要有一个函数来调用它。

我的意思是,这样做:

success: doSuccess();

而不是这个:

success: function() {}

或者,您可以根据需要使呼叫同步,请参阅:Is there a version of $getJSON that doesn't use a call back?