2017-02-17 7 views
2

私は純粋なJavascriptでWebsocketを使用しており、Websocket関数にPromisesを実装したいと考えています。私は何の誤りもないが、約束は働かない。Javascript - Websocketで約束を使う?

次のコードを使用すると、ソケットサーバーに正常に接続できますが、警告の出力は常に「失敗」しているためPromiseはスキップされているようです。

この場合、問題が何であるかを誰かが知っていますか? Ps:最新のGoogle 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'を何かに変更することができます。 {hello: 'ワールド'}) '... 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ライブラリを作成したあなたは、おそらくこのような何かをしたいよう

は、それはそうです。これは、接続/切断すると、メッセージを送信するための約束を返します。

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.')); 

メッセージに関する2つのオプションがあります。あなたがデータを送信し、応答メッセージを期待していた場合

  1. は - あなたは.sendRequest()メソッドを経由して約束を使用することができます。

    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