2012-10-27 2 views
0

을 완료 얻을 후에 만 ​​메시지 전송 :웹 소켓은 루프가 나는 코드를 아래와 같이이

var ws = new WebSocket("ws://localhost"); 
ws.onopen = function() { 
    // Long running loop 
    for (var i = 0; i < 1000000; i++) { 
     ws.send(i); 
     console.log(i); 
    } 
}; 

서버는 메시지를 수신을 (또는 나는 클라이언트는 메시지를 보내기 시작 생각) 루프가 완료됩니다 후. 이게 왜 그렇게? 페이지와 실행

+1

에 예를 재 작업 할 수있다. window.timeout을 통해 지연을 도입 해보십시오. – oberstet

답변

2

일부 지역은 다음과 같습니다

  • 네트워크 나는 잠시 동안을 테스트하지했습니다
  • 하지만 렌더링 DOM이 있으리라 믿고있어

    • 자바 스크립트 함수를 실행하거나 한 범위에서 코드를 실행하면 현재 범위가 존재할 때까지 DOM을 업데이트하거나 네트워크 요청을하는 호출을하는 경우에도 여전히 그렇습니다.

      다음 위의 코드에서

      function doSomething() { 
          document.body.innerHTML += 'hello'; 
          var ws = new WebSocket('ws://my-websocket-endpoint.com'); 
          ws.onopen = function() { alert('awesome!'); }; 
      } 
      
      doSomething(); 
      

      이 발생합니다

      • doSomething 실행하고 내부 코드가 실행됩니다.
      • doSomething 반환 및 범위는 변경
      • '안녕하세요'다음 UI가 웹 소켓 연결이
      • 그것은 잠시 될 수있다 만든
      • 보류중인 업데이트를 실행할 수있는 기회를 스레드 제공하는 브라우저와 DOM에 나타납니다 alert 화재가 발생할 때까지

      WebSocket 예를 구체적으로 봅니다. WebSocket 인스턴스를 만든 후에 이벤트 처리기를 추가 할 수 있다는 사실을 생각하면 이는 생성자를 호출하자마자 연결이 발생하지 않는다는 것을 의미합니다. 현재 실행 범위가 완료 될 때만 연결이 시도됩니다. 100 % 확인할 수는 없지만 실행 범위가 완료 될 때까지 WebSocket.send 함수가 실제로 데이터를 전송하는 것은 거의 불가능합니다. ,

      • sendStuff가 호출 될 루프 종료
      • 다음 네트워크 활동을 포함, 중 상태의 다른 어떤 처리하는 브라우저를 실행

        var ws = new WebSocket('ws://my-websocket-endpoint.com'); 
        
        function sendStuff() { 
            for(var i = 0; i < 10000; ++i) { 
            ws.send(i); 
            } 
        } 
        
        // Assume we are connected 
        sendStuff(); 
        

        위의 코드에서 나는 기대. 실제로 데이터를 전송하는 것을 포함합니다.

    1

    귀하의 질문에 답할 수는 없지만 코드가 올바르지 않습니다.

    new WebSocket 호출은 서버와의 비동기 핸드 셰이크를 시작합니다. 이 작업이 완료되면 websocket에 등록한 onopen 콜백이 실행됩니다. 이 때만 ws.send으로 전화하여 서버가 메시지를 수신 할 것으로 기대할 수 있습니다.루프가 데이터를 버퍼링 백그라운드에서 브라우저의 네트워킹 스레드에 의해 비동기 적으로 수행 보낼 때 매우 빠르게 실행되기 때문에

    그런 가능성

    var ws = new WebSocket("ws://localhost"); 
    ws.onopen = function() { 
        for (var i = 0; i < 1000000; i++) { 
         ws.send(i); 
         console.log(i); 
        } 
    }; 
    
    +0

    예를 들어 내가 한 것처럼 이제는 수정되었습니다. 그 점을 지적 해 주셔서 감사합니다. – Vishal

    관련 문제