是Javascript数组异步排序



是Javascript数组。排序函数异步?我不这么认为,但是当我运行下面的代码时,它看起来确实是:

$('#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,但是它的名字就说明了这一点)

在Firefox中使用Firebug调试器运行,我在控制台上面的DEBUG 2之前看到来自saveAll的POST,散布着DEBUG 1 s,并且我没有得到我的内容有效地返回。DEBUG 1正在给我我所期望的结果。

乍一看,这只对Javascript数组有意义。排序函数是异步的。

如果,确实,它是异步的,谁能建议一个好的方法重写它,除了写我自己的排序(我真的宁愿坚持他们的,如果只是为了清晰)。

No。Array#sort由ECMAScript规范保证是同步的,而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]]。

返回obj。

所以,它执行SortCompare中的操作。它只是比较它们(下面几行)。

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

最新更新