2016-06-16 3 views
1

파일 다운로드시 실시간으로 다운로드 속도를 표시하고 싶지만 다음 코드는 작동하지 않습니다. Speed은 전체 다운로드에 대해 0.0을 반환합니다.계산 AJAX 다운로드 속도

https.get(options, function (update) { 
    fileSize = (parseInt(update.headers['content-length'])/1048576).toFixed(1); 
    startTime = (new Date()).getTime(); 
    endTime = startTime; 
    update.on('data', function (chunk) { 
     file.write(chunk); 
     len += chunk.length; 
     fileDownloaded = (len/1048576).toFixed(1); 
     endTime = (new Date()).getTime(); 
     time = (endTime - startTime)/1000; 
     speed = ((fileSize/time)/(1024 * 1024)).toFixed(2); 
     progressPercentage.html(fileDownloaded + ' MB/' + fileSize + ' MB ' + speed + ' MB/s'); 
    }); 
}); 
+0

변수 좀 더 출력 할 경우, 아마도 당신은 범인을 식별 할 수 있습니다. 문제는 어디서부터 시작됩니까? – 4castle

+0

@ User394839859 - 'update.headers ['content-length ']'가 평가하는 것과 같은 몇 가지 기본 사항을 모르고 원격으로 디버그하기가 어렵습니다. 그러나 @CarlosCarucce는 그의 답변에서 좋은 점을 지적하고 있습니다. 이 적절한 JS를 만들기 위해 ('var'등으로 변수를 선언하여) 몇 가지 조치를 취한 다음 종결에서 변수의 범위를 확인해야합니다. – hightempo

답변

2

어쩌면 더 나은 솔루션이 있다고 생각하지만, 여기에 우리가 간다 :

var startTime = (new Date()).getTime(); 
var downloadedLength = 0; 

update.on('data', function (chunk) { 
    // ... 

    downloadedLength += chunk.length; 

    var now = (new Date()).getTime(); 
    var speed = downloadedLength/(now - startTime); //bytes/second 
    //speed/1024 should return in kilobytes 

    //... 
}); 

편집 :

+0

감사합니다,이 작품 - 간단! –

0

답을 생각 성능 향상을 위해 대신 (new Date()).getTime();Date.now() 사용을 고려 Carlos가 제공하는 것은 (new Date()) 대신 Performance.now()를 사용하는 것이 좋습니다. getTime()이 더 나은 선택입니다. 참고로

: https://developer.mozilla.org/en-US/docs/Web/API/Performance/now

+0

감사합니다. 나는 그것을 업데이트 할 것입니다. – CarlosCarucce

+0

'Date.now()'가 더 나을 것이라고 생각합니까? – CarlosCarucce