2014-03-14 79 views
1

我加載記錄到crossfilter對象做循環Ajax調用:數據多源導致`無效陣列寬度`錯誤

for (i=0;i<rangeToLoad.length;i++) { 

    url = "http://myserver/"+rangeToLoad[i]+"/myrecords.js" 

    $.ajax({ 
     url: url, 
     dataType:"json", 
     success: function (jsondata) { 

      var records = jsondata.records; 
      var parseDate = d3.time.format("%Y-%m-%d").parse; 

      records.forEach(function(d) { 
       d.date = parseDate(d.date); 
      }); 

      if (typeof myCrossfilter === "undefined") { //first call 
       myCrossfilter = crossfilter(records); 
      } else { 
       myCrossfilter.add(records); 
      } 

      initData(); 
      showData(); 
     } 
    }); 
} 

initData()功能基本上在我的crossfilter的尺寸和組對象被定義。

dims.date = myCrossfilter.dimension(function(d) {return(+d.date);}); 
groups.date={}; 
dims.date2 = myCrossfilter.dimension(function(d) {return(+d.date);}); 
groups.date2={}; 
dims.instrumenttype = myCrossfilter.dimension(function(d) {return(d.product);}); 
groups.instrumenttype = {}; 
groups.date.pnlSum = dims.date.group().reduceSum(function(d) {return(d.pnl);}); 
groups.date2.cumPnlSum = dims.date2.group().reduceSum(function(d) {return(d.cumpnl);}); 
groups.instrumenttype.pnlSum = dims.instrumenttype.group().reduceSum(function(d) {return(d.pnl);}); 

我的猜測是,不是每次更新每個ajax調用的現有維度,每次都會創建一個新的維度。

我該如何防止這種情況發生?

回答

0

竅門是通過檢查是否定義了交叉過濾器來僅在ajax調用的第一遍時創建尺寸。我也取消了ajax調用的異步屬性,因爲它對我來說不是一個大問題(數據加載非常快)。它可以防止找出首先完成哪個呼叫的頭痛誘發任務。

for (i=0;i<rangeToLoad.length;i++) { 

url = "http://myserver/"+rangeToLoad[i]+"/myrecords.js" 

$.ajax({ 
    url: url, 
    dataType:"json", 
    async:false, 
    success: function (jsondata) { 


     if (typeof myCrossfilter === "undefined") { //first call 
      myCrossfilter = crossfilter(records); 
      initData() 
     } else { 
      myCrossfilter.add(records); 
     } 

     showData(); 
    } 
}); 

}

2

Crossfilter最多隻支持32個維度。您可以使用dimension.dispose函數在完成尺寸後(showData之後)或新尺寸進入之前(initData之前)去除尺寸,以管理尺寸的數量。

正如接受的答案所示,Crossfilter也支持添加新行。在內部,Crossfilter管理一組偵聽器,用於在添加或刪除數據時通知內部維度和分組結構。因此,正確的做法是確保維度僅創建一次,然後在隨後的傳遞中根據需要更改數據。

+0

謝謝回答,但其實我已經通過在第一遍中確定的尺寸,然後只將記錄添加到crossfilter解決我的問題。我會發佈一個答案。 – Chapo

+0

此外,您的評論是錯誤的,我相信。 「crossfilter」的整個目的也是具有獨立於底層記錄集的維度。一旦你定義了他們,這是他們的全部目的,適用於你在你的交叉過濾器中扔到他們的任何記錄集。 – Chapo

+0

我只是看了一下代碼,你說得對。有很多支持添加(甚至在一定程度上刪除)數據。我原本以爲crossfilter是一個針對過濾和分組進行優化的只讀模型,但它比這更進一步。我會更新我的答案以反映這一點。 –

相關問題