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中执行操作。 这只是比较它们(下面几行)。
请注意,使用的排序是实现定义的(实际上在实现中有所不同),也不能保证稳定。