【问题标题】:D3: How to detect the end of the .each()D3:如何检测 .each() 的结尾
【发布时间】:2015-03-19 22:51:52
【问题描述】:

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

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

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

他们在 D3 中有什么方法可以检测到 .each() 的结尾吗?不是针对每个间隔,而是针对整个过程。

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

谢谢!

【问题讨论】:

  • each 是同步的
  • 哎呀。就是这样。谢谢。

标签: javascript arrays d3.js dynamic-arrays


【解决方案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>

【讨论】:

    【解决方案2】:

    首先我要说.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
        };
    });
    

    【讨论】:

    • 这与我发布此问题后的倾向相似,但您基本上明白了。谢谢!
    【解决方案3】:

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

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

    【讨论】:

    • 这与我发布此问题后的倾向相似,但您基本上明白了。谢谢!
    猜你喜欢
    • 2014-08-30
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多