我试图使用d3的队列,延迟和等待异步加载一些文件。问题是在循环中尝试这样做,并且对于循环中的每个项目,将获取的数据存储在字典中:
.await.myFunc(geo)
在myFunc中,我想访问geo来填写字典中的相应键,但是将它们传递到undefined
内会在myFunc中打印mylist = ["alice", "bob", "greta"]
funcdict = dict(((y, lambda x: x==str(y)) for y in mylist))
funcdict['alice']("greta")
#True
funcdict['alice']("alice")
#False
funcdict['greta']("greta")
#True
。
我不知道这个问题是关于Javascript的回调函数,还是D3的await(),或者两者兼而有之。
有什么建议吗?
由于
答案 0 :(得分:2)
您可以使用:
function myFunc(geo) {
return function(error, jsonData, csvData) {
// geo available here
console.log(geo);
myDictionary[geo].jsonData = jsonData;
myDictionary[geo].csvData = csvData;
};
};
然后:
var myDictionary = {};
// e.g. hierarchy = ["State", "County"]
hierarchy.forEach(function(geo) {
queue()
.defer(d3.json, 'assets/data/geo/' + geo + '/' + geo + '.json')
.defer(d3.csv, 'assets/data/geo/' + geo + '/' + geo + '_info.csv')
.await(myFunc(geo));
});
答案 1 :(得分:0)
您可以将其添加为任务,以便将其传递到myFunc。
queue()
.defer(d3.json, 'assets/data/geo/' + geo + '/' + geo + '.json')
.defer(d3.csv, 'assets/data/geo/' + geo + '/' + geo + '_info.csv')
.defer(callback=>callback(geo))
.await(myFunc);
...
function myFunc(error, jsonData, csvData, geo) {
console.log(geo);
}