有没有办法让d3.csv()同步而不是异步?
由于我根据页面上的不同触发器加载了多个csv文件,因此我的代码变得混乱了回调。
答案 0 :(得分:9)
d3.csv在设计上是异步的,以防止页面冻结,因此如果不更改d3库本身就无法更改。
但是,您可以通过d3.text()预加载所有文件,并调用d3.csv.parse或d3.csv.parseRows,这将是同步的,因为文本文件已加载。
举个例子,请参阅Mike Bostock在这篇文章this post中的回答。
答案 1 :(得分:1)
如果d3不可能(如THK所述),则可以使用jquery.ajax(),其中存在可以设置为false的异步字段。请参阅以下示例:
function getdatafromfile(filename) {
// Read annotation file. Example : %timeinstant \t %value \n
// Return an array of string
var arraydata;
$.ajax({
type: "GET",
url: filename,
dataType: "text",
async: false,
success: function(csv) {arraydata = $.csv.toArrays(csv,{separator:'\t'}); }
});
return arraydata;
}
答案 2 :(得分:1)
你可以解决'回电地狱'通过将d3.js与deferred / promise相结合。
Jquery.deferred示例:
func didBeginContact(contact: SKPhysicsContact) {
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask {
case puckCategory | goal1Category:
let scoreRight = childNodeWithName(scoreRightCategoryName) as! SKLabelNode
if let score = Int(scoreRight.text) {
scoreRight.text = "\(score + 1)"
}
case puckCategory | goal2Category:
let scoreLeft = childNodeWithName(scoreLeftCategoryName) as! SKLabelNode
if let score = Int(scoreLeft.text) {
scoreLeft.text = "\(score + 1)"
}
default:
// There are other contacts that need to be handled; paddle+puck,puck+wall, etc
fatalError("other collision: \(contactMask)")
}
}