Javascript数组排序是异步的吗?

Joe*_*bel 3 javascript sorting jquery asynchronous

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
});
Run Code Online (Sandbox Code Playgroud)

(如果需要的话,我可以提供compareRowsBasedOnColumn,但这就是名字所说的.)

在Firefox与Firebug调试运行,我看到帖子从我saveAll在控制台DEBUG 2上方,与穿插DEBUG 1秒,我没有得到我的内容有效地使出.DEBUG 1正在给我我期望的结果.

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

如果它确实是异步的,那么任何人都可以提出一种重写这种方法的好方法,而不是编写我自己的类型(我真的更愿意坚持使用它们,如果只是为了清晰起见).

Ben*_*aum 7

是.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中执行操作.这只是比较它们(下面几行).

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