2014-06-06 2 views
1

나는 WebRTC에 걸쳐 덩어리로 파일을 보내려고 해요, 내가 파일의 각 청크를 전송 RTCDataChannel.send() 완료된 후 호출 할 콜백 함수를 만들 수 있는지 궁금하네요.RTCDataChannel이 동기/차단 호출을 보내고 있습니까()?

RTCDataChannel.send() 동기/차단 호출인가? 그렇다면 .send() 뒤에 줄에서 내 콜백을 실행할 수 있습니다.

.send()이 비동기/비 차단 인 경우 .send()이 콜백 기능을 허용하지 않기 때문에 까다로워집니다. 버퍼 및 시간 초과를 사용하지 않으려합니다.

+0

동기식 경우 콜백이 필요하지 않습니다. – Bergi

+0

음 ...'.send()'주위를 추상화했기 때문에'.send()'를 호출하도록 정의한 함수에 콜백을 전달해야합니다. – Hristo

답변

2

send method이 차단 중입니다. 그러나 데이터가 유선을 통과 할 때까지 기다리지 않고 나중에 (또는 스크립트 실행과 병행하여) 전송 될 수있는 내부 버퍼에 데이터를 넣습니다.

전송되지 않은 데이터의 양은 bufferedAmount property으로 사용할 수 있으며, 이는 send() 호마다 동기식으로 증가합니다 (다음 이벤트 루프가 돌아올 때까지는 업데이트되지 않음).

래퍼를 비동기로 만들 수 있으므로 현재 버퍼링 된 데이터가 "너무 많음"(적합하다고 판단되는 기준) 일 때 실제로 send()을 호출하기 전에 시간 초과를 설정하십시오.

+0

Bergi에게 감사드립니다! '.send()'가 블로킹하고'bufferedAmount'가 존재한다는 것을 알면 좋다. 내가'bufferedAmount'를 조사하고 그것이 충분히 작을 때까지 기다려야 할 것처럼 들립니다. – Hristo

1

위에서 언급했듯이 send()는 효과적으로 비동기식입니다. 배달 확인을받지 못합니다. 그러나 채널을 때 호출되는 콜백 onbufferedamountlow이 소모 그것은 당신이 다음 청크를 보내시기를 결정하는 콜백을 사용할 수 있습니다

(MDN onbufferedamountlow 참조) bufferedAmountLowThreshold 설정 값 이하로 버퍼를 보낼 수 있습니다.

그러나 이것은 초안 표준에 비해 비교적 새롭고 모든 곳에서 지원되지 않을 수 있습니다.