2017-01-29 5 views
1

Ich mache mein Projekt in reactjs und ich möchte vor Zeit in Tabelle zu zeigen.Ich benutze Moment js, um Zeit zu zeigen (fromNow()), aber es zeigt die Zeit einige Sekunden nur wenn die Daten vom Server kommen. Und es zeigt direkt vor 6 Stunden, wenn die Daten nicht vom Server kommen. Nach 2 Minuten Zeitintervall zeigt es 6 Stunden vor. Wie in der Tabelle unten gezeigt. table to shoe time agoGenaue Zeit kommt nicht Form Moment js

der Code meines Projektes ist unter

componentDidMount() { 
let socket = new WebSocket('wss://api.example.com.np/ws'); 
this.setState({ socket: socket,noOfVehicle:this.state.supportInfo.length }); 
this.getSupportInfo(); 
socket.onmessage = ((message) => { 
    let socketData = JSON.parse(message.data); 
    let device_id = socketData[0].device_id; 
    let updatedSupportInfo = this.getUpdatedInfo(this.state.sourceName); 
    let flag = true; 
    let uSupport = updatedSupportInfo.map(function(item){ 
    if(device_id == item.device_id){ 
     item.current_pos = socketData[0].current_pos; 
     if(item.current_pos){ 
     flag = true; 
     item["latlng"] = item.current_pos.x + ',' + item.current_pos.y; 
     }else{ 
     flag = false; 
     } 
    let time = new Date(socketData[0].timestamp); 
    let now = new Date();  
     let timeAgoIn = moment(time).fromNow(true); 
     item["timeAgoIn"] = timeAgoIn; 
     } 

getSupportInfo() { 
axios({ 
     method: 'get', 
     url: 'https://support.taranga.com.np/support_info' 
     }) 
    .then((response) => { 
     for (var i = 0; i < response.data.length; i++) { 
      if(response.data[i].current_pos){ 
      response.data[i]["latlng"] = response.data[i].current_pos.x + ',' + response.data[i].current_pos.y; 
      let time = new Date(response.data[i].timestamp) 
      let now = new Date(); 
      let a = moment(time); 
      let b = moment(now); 
      let timeAgo = b.diff(a, 'hours') 
      let timeAgoIn = moment(time).fromNow(true) 
      response.data[i]["timeAgo"] = timeAgo; 
      response.data[i]["timeAgoIn"] = timeAgoIn; 
} 
     } 
     this.setState({ 
     supportInfo: response.data 
     }); 
    }) 
    .catch((error)=>{ 
     throw (error); 
    }); 
} 

getUpdatedInfo(name) { 
    let uInfo = []; 
    let tempSupport = this.state.supportInfo.slice(); 
    _.map(tempSupport,(value,key) =>{ 
     if(value.timeAgo !=0){ 
     let time = new Date(value.timestamp) 
     let now = new Date(); 
     let a = moment(time); 
     let b = moment(now); 
     let timeAgo = b.diff(a, 'minutes') 
     console.log(timeAgo); 
     //let timeAgo = moment.duration(b-a).humanize() 
     let timeAgoIn = moment(time).fromNow(true) 
     value["timeAgo"] = timeAgo; 
     value["timeAgoIn"] = timeAgoIn; 
     } 
    }); 
    this.setState({ 
     supportInfo:tempSupport 
    }); 

der Code in Tabelle

<TableHeaderColumn dataField="timeAgoIn" dataSort={true}>Time Ago</TableHeaderColumn> 
+0

, warum Sie mit 'new Date()' für ' Zeitstempel vom Server? Ist es dort erforderlich? Und welches Format hat Timestamp? –

Antwort

0

ich Ihre Logik ist fehlerhaft glauben, ist zu zeigen, gezeigt, wenn Sie die Informationen erhalten Sie das sind die Speicherung timeAgo einmal, jedoch timeAgo ist eine Eigenschaft, die sich im Laufe der Zeit ändert, zB:

Sie erhalten um 12:00 Uhr eine Nachricht, Sie setzen timeAgo auf 1 Sekunde (oder w/e js setzt es auf) Sie überprüfen Ihren Bildschirm um 12:05, timeAgo für diese Nachricht ist immer noch 1 Sekunde, weil dies einmal berechnet wird, aber die Zeit ist vergangen und timeAgo sollte vor 5 Sekunden sein, oder?

timeAgo Eigenschaft sollte als Zeitstempel bleiben Sie vom Server empfangen und berechnet werden, wenn Sie Ihre Tabelle aktualisieren (wenn Sie dies tun mögen, ist ein anderes Thema)

+0

Ja, ich habe getan, was Sie gesagt haben. Aber nichts hat sich geändert. Immer noch das gleiche Problem. –

+0

erste Sache: Ich habe gerade festgestellt: 'Lassen Sie unsSupport = updatedSupportInfo.map (Funktion (Element) { if (device_id == item.device_id)' Dies ist nicht, wie Sie 'map' verwenden sollten' finden' statt Zweitens: Bitte aktualisieren Sie Ihre Post mit dem Code, den Sie verwenden, um die Berechnung der Zeit zu aktualisieren, kann ich keinen Kommentar zu Code, den ich nicht sehen kann – ospfranco