我有一个奇怪的行为,看起来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
的情况下启动分拣机功能,分拣机功能在运行时就找不到数据。
有没有办法让成功阻止线性?
谢谢,任何帮助!!
答案 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?