Javascript数组排序是异步的吗?

Javascript Array.sort函数是否异步? 我不这么认为,但是当我运行以下代码时,它确实似乎是:

$('#alphabetical-order').data('sort-column', 'FileAlpha'); $('#first-numeric-order').data('sort-column', 'FileFirstNumeric'); $('#last-numeric-order').data('sort-column', 'FileLastNumeric'); $('#alphabetical-order, #first-numeric-order, #last-numeric-order').each(function() { var $this = $(this); $this.data('compare-function', function(row1, row2) { console.log('column = ' + $this.data('sort-column')); // >> DEBUG 1 compareRowsBasedOnColumn(row1, row2, $this.data('sort-column')); }); }).click(function() { var $this = $(this); var $content = $('table.sheetlist-content tr.content'); $content.sort($this.data('compare-function')); console.log('$content.sort complete'); // >> DEBUG 2 $table_body = $('table.sheetlist-content tbody') $table_body.html(''); for (i=0; i<$content.length; ++i) { $table_body.append($content[i]); } saveAll(); // which POSTs to our server }); 

(如果需要,我可以提供compareRowsBasedOnColumn,但它几乎就是这个名字所说的。)

使用Firebug调试器在Firefox中运行,我在上面的DEBUG 2 之前的控制台中看到了我的saveAll中的POST,穿插了DEBUG 1 ,我没有得到有效的内容。 DEBUG 1给了我预期的结果。

另外,只有Javascript Array.sort函数是异步的才有意义。

如果它确实是异步的,那么任何人都可以建议一个改写这个的好方法,而不是写我自己的那种(我真的宁愿坚持他们的,如果只是为了清晰)。

是。 Array#sort保证与JavaScript所基于的ECMAScript规范同步。

该算法在此处明确指定:

设obj是调用ToObject将此值作为参数传递的结果。

获取this值。

设len是将Uint32应用于使用参数“length”调用obj的[[Get]]内部方法的结果。

获取.length值。

如果comparefn未定义且不是此数组元素的一致比较函数(请参见下文),则sort的行为是实现定义的。

获取传递的比较函数。 如果它是未定义的,那么实现可以做任何想做的事情(实际上,它会进行词法排序,但是它必须是同步的,因为我们等待它,因为我们很快就会看到它)。

执行依赖于实现的调用序列,调用obj的[[Get]],[[Put]]和[[Delete]]内部方法以及SortCompare(如下所述),其中每次调用[[]的第一个参数获取]],[[Put]]或[[Delete]]是一个小于len的非负整数,其中对SortCompare的调用的参数是先前调用[[Get]]内部方法的结果。 [[Put]]和[[Delete]]内部方法的throw参数将为true。 如果obj不稀疏,则不能调用[[Delete]]。

返回obj。

因此,它在SortCompare中执行操作。 这只是比较它们(下面几行)。

请注意,使用的排序是实现定义的(实际上在实现中有所不同),也不能保证稳定。