2017-07-03 31 views
1

考慮以下片段 - 其試圖跟蹤數據操作通過d3.queue().defer()發生的進展:何時經由D3隊列()獲得的數據延遲()出現

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 vieweed JavaScript控制檯是:

enter image description here

那麼接下來:只有適度冗長的操作(udpateViz())後數據出現。

問題是:我需要在該方法的開始處可用的數據。更一般地說:可以做些什麼來確定完成queue().defer() - 以便後續操作可能能夠依賴於存在的數據?

回答

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); 
} 
+0

好的!這就說得通了。嘗試一下:我有兩種方法需要鏈接。希望把第一個推遲(chained1).await(chained2) – javadba

+0

我*不能*鏈接功能的工作;( – javadba

+0

這裏是一個很好的例子d3.queue使用:http:// bl。 ocks.org/mapsam/6090056 –