본문 바로가기

Thing about programming/Web

Fetch: Download Progress

fetch메서드는 다운로드 진행사항을 추적할 수 있습니다.

upload진행사항은 추적 불가능한데, 이건 추후에 배울XMLHttopRequest로 보완 가능합니다.

 

다운로드 진행사항 추적을 위해 response.body의 프로퍼티를 사용할 수 있습니다.

ReadableStream입니다. body를 받을 때, 그것을 청크별로 나눠 받을 수 있는 특별한 객체입니다.

Readable-stream자체에 대한 설명은 Streams API에서 읽으면 됩니다.

 

response.text(), response.json()과 다르게 response.body에서는 읽는 과정에서 모든 통제권을 가질 수 있어서 ,어느때건 그것이 얼마나 사용되었는지 확인 가능합니다.

 

//예시

const reader = reponse.body.getReader();

// infinite loop while the body is downloading
// done is true for the last chunk
// value is Uint8Array of the chunk bytes
while(True){
	const {done, value} = awair reader.read();
    
    if(done){
    	break;
    }
    
    console.log(`Revived: ${value.length} bytes`);

다시 정리하면,

done: 계속 false이다가 마지막값에 대해서 true

value: Unit8Array chuck의 배열

 

!. ReadableStream이 for ..await..of 반복을 지원하기는 하지만, 널리 사용되고 있는 건 위와 같이 while을 사용하는 방식입니다.

 

따라서

진행사항을 체크하려면, value.length값이 늘어날 때마다 카운트를 증가시키면 됩니다. 

 

https://ko.javascript.info/fetch-progress

 

Fetch: Download progress

 

ko.javascript.info

해당 링크에 이것과 관련된 구현 사항도 제시되어 있습니다.

 

step1: response.body의 getReader로 'reader'를 만듭니다.

step2: response.header.get('ContentLength')로 전체 내용의 길이를 구할 수 있습니다.

step3: 데이터를 읽습니다. 읽으며 value.length값이 증가하면 카운트를 증가시켜 카운트 값을 확인합니다.

step4: 단일 Unit8Array에 chunk묶음을 합칩니다.

    4-1. unit8Array() 객체에 value.lenth 총합 길이 (= 카운트 길이) 넣어 초기화

    4-2. unit8Array()객체에 set메서드로 내용 자체 치기 (for...of 돌려서)

step5: string으로 디코딩하기 ex. let result = new textDecoder('UTF-8").decode( 4번진행사항의 객체)

step6: 완성된 string객체를 JSON.parse(5번진행사항 스트링으로 변경한값)  => 이제 사용ㄱ ㅏ능

'Thing about programming > Web' 카테고리의 다른 글

[CSS] SASS 그리고 SCSS  (0) 2022.07.26
Fetch: Abort  (0) 2022.07.25
[HTML] HTML data-* 속성 / dataset Javascipt  (0) 2022.07.24
[CSS] textContent vs innerText vs innerHTML  (0) 2022.07.15
call / apply, 데코레이팅, 포워딩  (0) 2022.07.14