请考虑以下代码段 - 它会尝试通过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控制台中查看:
那么:数据仅在经过适度冗长的操作(udpateViz()
)后出现。
问题是:我需要在该方法的开头处提供的数据。更一般地说:可以做些什么来确定完成queue().defer()
- 以便后续操作可以依赖于存在的数据?
答案 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);
}