在D3.js中,我使用以下方法遍历数据:
elem.allDataRows.each(function(d, i) {
elem.checkboxMemory[i] = {
id: d.key,
isChecked: d.isChecked
};
});
由于此过程是异步的,我需要能够确定循环过程何时完成。
他们在D3中的任何方式可以检测到.each()的结束吗?不是每个间隔,而是整个过程。
仅供记录, elem.allDataRows 是一个数组。
谢谢!
答案 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
};
}