jquery Javascript数组排序是异步的吗?[已关闭]

h5qlskok  于 2023-03-17  发布在  jQuery
关注(0)|答案(1)|浏览(97)

**已关闭。**此问题需要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函数是异步的才有意义。
如果它确实是异步的,除了编写我自己的排序(我真的宁愿坚持使用他们的排序,即使只是为了清晰起见),谁能提出一个重写它的好方法呢?

chhqkbe1

chhqkbe11#

不,Array#sort由JavaScript所基于的ECMAScript规范保证是同步的。
算法明确规定如下:
令obj为调用ToObject并将this值作为参数传递的结果。
获取this值。
设len是将Uint32应用于用参数“length”调用obj的Get内部方法的结果。
获取.length值。
如果comparefn不是未定义的,并且对于该数组的元素不是一致的比较函数(见下文),则sort的行为是由实现定义的。
获取传递过来的比较函数,如果没有定义,实现可以做任何它想做的事情(实际上,它做词法排序,但是它必须是同步的,因为我们等待它,我们很快就会看到)。
对obj的GetPutDelete内部方法以及SortCompare执行依赖于实现的调用序列(如下所述),其中每次调用GetPut,或Delete是小于len的非负整数,并且其中调用SortCompare的参数是以前调用Get的结果内部方法。PutDelete内部方法的throw参数值将为true。如果obj不是稀疏的,则不能调用Delete
返回对象
因此,它在SortCompare中执行操作,SortCompare只是比较它们(下面几行)。
请注意,使用的排序是实现定义的(实际上在不同的实现中会有所不同),它也不能保证是稳定的。

相关问题