2017-02-17 3 views
2

순수 Javascript에서 Websocket을 사용하고 있으며 Websocket 함수에 Promise를 구현하고 싶습니다. 나는 어떤 오류도 내지 않지만 Promise는 작동하지 않습니다.Javascript - Websocket에서 약정 사용

다음 코드를 사용하여 소켓 서버에 성공적으로 연결할 수 있지만 경고 출력은 항상 "실패"되어 있으므로 약속을 건너 뛰었습니다.

누군가이 경우이 문제가 무엇인지 압니까? Ps : 최신 Chrome 브라우저와 최신 Mozilla Firefox 브라우저에서 테스트를 수행했으며이 예제에서는 몇 가지 기본적인 검사/오류 처리를 생략했습니다.

function Connect() 
{ 
    server = new WebSocket('mysite:1234'); 

    server.onopen = (function() 
    { 
     return new Promise(function(resolve, reject) 
     { 
      if (true) 
      { 
       resolve(); 
      } 
      else 
      { 
       reject(); 
      } 
     }); 
    }).then = (function() 
    { 
     alert('succeeed'); 
    }).catch = (function() 
    { 
     alert('failed'); 
    }); 
} 
+0

당신은 당신이 성공적으로 연결할 수 어떻게 생각 하죠? – bytesized

+1

FYI : 귀하의 코드는'server.onopen'을 마지막 함수 (경고가 실패한 함수)로 설정합니다 - 당신은'.then'과'.catch'를 무엇이든 바꿀 수 있고 여전히 똑같이 할 것입니다 ... 효과적으로 catch = ({hello : 'world'})'... x는 {hello : 'world'}'가 될 것이고 중간 객체는 '.then' 및'.catch' 속성이 버려졌습니다. –

+0

설명 해 주셔서 감사합니다. – Piet

답변

4

새로운 연결로 약속을 사용하려는 시도가 약간 잘못되었습니다. connect()에서 약속을 되풀이하여 서버 연결시기를 알 수 있습니다.

function connect() { 
    return new Promise(function(resolve, reject) { 
     var server = new WebSocket('ws://mysite:1234'); 
     server.onopen = function() { 
      resolve(server); 
     }; 
     server.onerror = function(err) { 
      reject(err); 
     }; 

    }); 
} 

그런 다음, 다음과 같이 사용합니다 : :

connect().then(function(server) { 
    // server is ready here 
}).catch(function(err) { 
    // error here 
}); 
+0

@Piet -이 질문에 대한 대답이 있습니까? – jfriend00

+0

지연되어서 죄송합니다. 이 server.onopen() 함수에 대한 문제를 해결할 것, 그래서 그 감사합니다! 그러나 connect() 함수는 한 번만 실행되므로 server.onopen()도 작동합니다. 아시다시피 우리는 기본 WebSocket의 일부로 server.onmessage() 함수도 가지고 있습니다. server.onmessage()가 서버로부터 데이터를 수신 할 때마다 Promise를 반환하려고합니다. 이것이 가능합니까? – Piet

+3

@Piet - 단순히 약속이 작동하는 방식이 아닙니다. 약속은 원샷 장치입니다. 그들은 오직 한 번만 발사합니다. 들어오는 메시지는 두 번 이상 발생할 수 있으므로 약속을위한 좋은 디자인 매칭이 아닙니다. 또한 새로운 이벤트가 발생할 때마다 새로운 약속을 만들지 않습니다. 그것은 약속이 어떻게 작동하는지 전혀 아닙니다. 비동기 작업을 트리거 할 때 약속을 만들면 해당 작업의 응답이 하나만 기다리고 있습니다. 약속은 그 결과를 모니터하는 데 사용됩니다. 반복 이벤트에 대한 일반 콜백 만 사용해야합니다. – jfriend00

2

나는 정확히 같은 문제에 직면하고 작은 websocket-as-promised 라이브러리를 생성 당신은 아마 이런 식으로 뭔가를 원하는 것처럼

는 것 같습니다.

  1. 데이터를 전송하고 응답 메시지를 기대한다면 - 당신이 .sendRequest() 방법을 통해 약속을 사용할 수 있습니다 : 두 가지 옵션이 메시지에 관한

    const WebSocketAsPromised = require('websocket-as-promised'); 
    const wsp = new WebSocketAsPromised(); 
    
    // connect 
    wsp.open('ws://echo.websocket.org') 
        .then(() => console.log('Connected.')) 
        // send data and expect response message from server 
        .then(() => wsp.sendRequest({foo: 'bar'})) 
        .then(response => console.log('Response message received', response)) 
        // disconnect 
        .then(() => wsp.close()) 
        .then(() => console.log('Disconnected.')); 
    

    : 그것은/연결 해제 메시지를 보내기위한 약속을 반환

    wsp.sendRequest({foo: 'bar'}); // returns promise 
    // actually sends message with unique id: {id: 'xxxxx', foo: 'bar'} 
    // promise waits response message with the same id: {id: 'xxxxx', response: 'ok'} 
    
  2. 그냥 메시지를 보낼 응답을 기대하지 않는 경우 - .send() 방법을 사용 :

    wsp.send(data); // returns undefined 
    
관련 문제