D3:如何检测.each()的结尾

时间:2015-03-19 22:51:53

标签: javascript arrays d3.js dynamic-arrays

在D3.js中,我使用以下方法遍历数据:

elem.allDataRows.each(function(d, i) {
    elem.checkboxMemory[i] = {
        id: d.key,
        isChecked: d.isChecked
    };
});

由于此过程是异步的,我需要能够确定循环过程何时完成。

他们在D3中的任何方式可以检测到.each()的结束吗?不是每个间隔,而是整个过程。

仅供记录, elem.allDataRows 是一个数组。

谢谢!

3 个答案:

答案 0 :(得分:1)

each是同步的。

d3.selectAll('div').each(function() {
 log(d3.select(this).text()); 
});

log('done');

function log(text) {
   var d = document.createElement('pre');
    d.innerHTML = 'log: ' + text;
   document.getElementById('output').appendChild(d);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<div>1</div>
<div>2</div>

<output id="output"></output>

答案 1 :(得分:1)

首先,我首先要说.each实际上是同步。因此,如果你想要做的只是在完成后执行代码,那么你可以在.each电话后的第一行执行此操作。

如果您在.each循环期间尝试识别集合中的最后一项,以便可以应用特殊逻辑,那么您需要将当前索引与jquery对象的长度进行比较。请参阅下面的示例。

var lastIndex = elem.allDataRows.length - 1;
elem.allDataRows.each(function(d, i) {
    if (i == lastIndex) {
        // Do something cool here!
    }

    elem.checkboxMemory[i] = {
        id: d.key,
        isChecked: d.isChecked
    };
});

答案 2 :(得分:0)

一种简单的方法是检查索引的值 i

function(d, i) {
    if (i == elem.allDataRows.length - 1){
        // last element
    }
    elem.checkboxMemory[i] = {
        id: d.key,
        isChecked: d.isChecked
    };
}