我有一个奇怪的行为,看起来是(A)同步方法调用的问题?!?我没有把握!一个函数使用getJSON接收数据,post处理这些数据,将它们添加到一个表中,该表可以通过表排序插件(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);
}
最后,在for-each之后,我必须更新表排序器-extension并开始新的排序:
jQuery("#table").trigger("update");
$("#table").trigger("sorton",[[[1,1]]]);
}; //end of "success
这段代码被简化了。问题是,只有当我启动这个函数延迟setTimeout('$("#trends").trigger("sorton",[[[1,1]]]);',20);
时,$("#table").trigger("sorton",[[[1,1]]]);
才能正常工作。
我认为,输出obj.html(result);
将是异步的。因此,如果我在不使用setTimeout
的情况下启动排序函数,则排序函数在运行时将找不到数据。
有没有一种方法可以将成功块线性化?
谢谢你的任何帮助!
发布于 2011-07-02 21:29:43
如果查看表排序程序的源代码,就会发现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);
一个完整的技巧是将您的排序添加到该代码块的末尾。我不确定我能不能提供一个更优雅的解决方案,但我想与您分享这个发现。
发布于 2011-06-29 21:54:32
我想你或多或少解决了你自己的问题。将所有的success:回调代码放在一个函数中,并在success属性中指定该函数。getJSON()调用是异步的,因此当它完成调用时,需要存在一个要调用的函数。
我的意思是,这样做:
success: doSuccess();
而不是这样:
success: function() {}
或者,如果您愿意,也可以使调用同步,请参阅以下内容:Is there a version of $getJSON that doesn't use a call back?
https://stackoverflow.com/questions/6521607
复制相似问题