[英]Asynchronous Function in Iteration - javascript
我試圖不復制代碼並循環在異步的d3中的函數。 這是一些代碼
由於d3.text是異步的,我無法以正確的方式使用索引u
將對象附加到DOM。 我該怎么辦呢? d3.text完成后,我需要循環進入下一次迭代
for(var u in urls) {
console.log(u);
var url = "interest_points/" + urls[u] + ".csv";
var data_gpBy_month = {};
var sortable_month = []
d3.text(url, function(text) {
// some code...
var data = d3.csv.parseRows(text).map(function(row) {
//some code...
});
//some code
});
}
像這樣的東西(小提琴: http : //jsfiddle.net/EYAYT/2/ )?
var urls = ["asd", "asdasd", "Asdasfa"];
var currentUrlIndex = 0;
var getUrl = function(){
if (currentUrlIndex >= urls.length){
return null;
} else {
return "interest_points/" + urls[currentUrlIndex++] + ".csv";
}
}
var execd3Text = function(){
var url = getUrl();
if (url){
d3.text(url, function(text) {
//some code;;
execd3Text();
});
}
}
execd3Text();
循環應該簡單地成為:
for(var u in urls) { loadParseAndRender(u); }
所有現有的邏輯然后移動到loadParseAndRender
,但此時u
永遠不會被覆蓋。 即,用花哨的術語來說,它會在封閉中被捕獲。
function loadParseAndRender(u) {
// the rest of your code
}
David W建議的內容與abive相同,但如果沒有為它創建命名函數,你可以這樣做:
for(var _u in urls) {
(function(u) { // this is an anonymous function
// the rest of you code
})(_u) // this function gets called as soon as it's declared
}
如果我理解得當:
function doSomething(array) {
var u = array.shift();
console.log(u);
var url = "interest_points/" + urls[u] + ".csv";
var data_gpBy_month = {};
var sortable_month = []
d3.text(url, function(text) {
// some code...
var data = d3.csv.parseRows(text).map(function(row) {
//some code...
});
//some code
if (array.length > 0)
doSomething(array);
});
doSomething(Object.keys(urls));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.