2013-11-28 84 views
1

我試圖構建一個繪圖網頁,它從多個xively提要中獲取數據並用Rickshaw(基於D3)繪製它們。我遇到的問題是我無法訪問調用函數之外的服務器返回的數據。我是js的新手,所以我不確定如何處理調用的異步性質。我想致電xively.feed.history()獲取歷史數據的各個部分,並將它們連接到一個圖表上。無論如何,這裏和我嘗試過的東西類似。它基於的xively tutorial多次調用xively.feed.history()

xively.setKey('xxxx my key ') 
// Replace with your own values 
var feedID  = 12345678,   // Feed ID 
    selector  = "#myelement"; // Your element on the page 

var series = []; 
xively.feed.history(feedID, { duration: "10days", interval: 1800 ,limit: 1000}, function (mydata) { 
    mydata.datastreams.forEach(function(stream){ 
     if ((stream.id == "tempinside") || (stream.id == "tempoutside")) { 
      var points = []; 
      stream.datapoints.forEach(function(datapoint){ 
       points.push({x: new Date(datapoint.at).getTime()/1000.0, y: parseFloat(datapoint.value)}); 
      // Add Datapoints Array to Graph Series Array 
      }); 
      series.push({ 
       name: stream.id, 
       data: points 
      }); 
     }; 
    }); 


    var graph2 = new Rickshaw.Graph({ 
     element: document.querySelector("#chart2"), 
     width: 600, 
     height: 400, 
     renderer: 'line', 
     series: [{ 
      data: series[0].data, 
      name: series[0].name, 
      color: 'red' 
      },{ 
      data: series[1].data, 
      name: series[1].name, 
      color: 'blue' 
      }] 
    }) 
}) 

正如我所說的,我是新來的JavaScript,所以也許我失去了一些東西。如果將圖放置在xively.feed.history函數的回調部分內,則該圖工作正常。如果我試圖對函數進行多次調用,那麼在圖形代碼運行時數據就沒有準備好。

回答

0

好吧,我做了它的工作,我已經把它的一個子集在這裏,讓其他人可以看到我是如何做到的。

var starttime = moment().subtract("day", 3); 
series['tempoutside']=[ 
{x:starttime.subtract("second",2).unix(),y:15}, 
{x:starttime.subtract("second",1).unix(),y:15} 
]; 


graph = new Rickshaw.Graph({ 
    element: document.querySelector("#chart"), 
    height: 400, 
    width: 600, 
    renderer: 'line', 
    interpolation: 'step-before', 
    series: new Rickshaw.Series([ 
     { 
      name: 'temperature', 
      data: series['tempoutside'], 
      color: 'blue', 
     } 
    ], series) 
}); 

xively.datastream.history("123456789", "tempoutside", query, loadData); 

function loadData(data) { 
    //console.log('Getting ' + data.id + 'data from Xively'); 
    if (data.datapoints != undefined){ 
     //console.log('received ' + data.datapoints.length +' datapoints'); 
     lastdata=data; 
     var filtedData = data.datapoints.filter(function(x) { return (x.value >0.005); }); 
     for (var i=0; i < filtedData.length; i++) { 
      var date = moment(filtedData[i].at); 
      var value = parseFloat(filtedData[i].value+0.000001); 
     series[data.id].push({x: date.unix(), y: value}); 
     } 
     graph.render(); 
    } 
} 

以我的最終代碼我還與.pop()除去從series['tempoutside']陣列虛設初始化值。我在數組中需要它們,因爲在數據從xively返回之前,圖形首先被創建。當數據返回時,xively.datastream.history()函數調用loaddata()回調函數,將數據推入series陣列。此外,我不明白你不需要將數據推入圖形系列數組,因爲數組在構建圖形時作爲參考傳遞。更新數組,然後調用graph.render()並重新制作它。贏得!這意味着可以對Xively進行多次調用,以獲得比一次API調用(限於1000個數據點)更多的數據。請記住,在繪圖前按x值對數據進行排序....