**已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
八年前就关门了。
社区在上个月审查了是否重新讨论这个问题,并将其关闭:
原始关闭原因未解决
Improve this question
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中运行时,我在控制台中看到来自saveAll
的POST在上面的DEBUG 2
之前,中间穿插着DEBUG 1
,我没有得到我的内容有效地重新排序。DEBUG 1
给了我预期的结果。
顺便说一句,只有Javascript Array.sort函数是异步的才有意义。
如果它确实是异步的,除了编写我自己的排序(我真的宁愿坚持使用他们的排序,即使只是为了清晰起见),谁能提出一个重写它的好方法呢?
1条答案
按热度按时间chhqkbe11#
不,
Array#sort
由JavaScript所基于的ECMAScript规范保证是同步的。算法明确规定如下:
令obj为调用ToObject并将this值作为参数传递的结果。
获取
this
值。设len是将Uint32应用于用参数“length”调用obj的Get内部方法的结果。
获取
.length
值。如果comparefn不是未定义的,并且对于该数组的元素不是一致的比较函数(见下文),则sort的行为是由实现定义的。
获取传递过来的比较函数,如果没有定义,实现可以做任何它想做的事情(实际上,它做词法排序,但是它必须是同步的,因为我们等待它,我们很快就会看到)。
对obj的Get、Put和Delete内部方法以及SortCompare执行依赖于实现的调用序列(如下所述),其中每次调用Get,Put,或Delete是小于len的非负整数,并且其中调用SortCompare的参数是以前调用Get的结果内部方法。Put和Delete内部方法的throw参数值将为true。如果obj不是稀疏的,则不能调用Delete。
返回对象
因此,它在SortCompare中执行操作,SortCompare只是比较它们(下面几行)。
请注意,使用的排序是实现定义的(实际上在不同的实现中会有所不同),它也不能保证是稳定的。