d3:使d3.csv函数同步

时间:2013-11-11 04:46:07

标签: d3.js

有没有办法让d3.csv()同步而不是异步?

由于我根据页面上的不同触发器加载了多个csv文件,因此我的代码变得混乱了回调。

3 个答案:

答案 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)")
    }
}