何时通过d3 queue()。defer()获得数据

时间:2017-07-03 11:20:14

标签: javascript d3.js

请考虑以下代码段 - 它会尝试通过d3.queue().defer()跟踪数据操作的进度:

var data = [];
function analyze(error, f ) {
    if (error) {
        console.log(error);
    }
    console.log('Inside analyze: f.length=' + f.length);
    data.push(f);
}
var q = d3.queue()
    .defer(d3.csv, fnames[0])
    .await(analyze);

console.log('after queue: data.len=' + data.length);

function updateViz(data2) {
   // Do some d3 stuff with data2.. takes some time..
   // .. 
    console.log('Finished updateViz: data2.len=' + data2.length);
}

updateViz(data);
console.log('after updateViz: len=' + data.length);

输出 - 在chrome javascript控制台中查看:

enter image description here

那么:数据仅在经过适度冗长的操作(udpateViz())后出现。

问题是:我需要在该方法的开头处提供的数据。更一般地说:可以做些什么来确定完成queue().defer() - 以便后续操作可以依赖于存在的数据?

1 个答案:

答案 0 :(得分:2)

d3.queue是一个异步函数,意味着执行更多代码(调用updateViz)不会等待它完成。最简单的解决方案是将依赖于d3.queue完成的代码放入其回调函数中。 d3.queue的回调函数始终在所有延迟步骤完成后执行。

var q = d3.queue()
    .defer(d3.csv, fnames[0])
    .await(updateViz);

function updateViz(error, data2) {
    if (error) {
        console.log(error);
    }

    updateViz(data2);
}