2017-02-17 26 views
2

我在純Javascript中使用Websockets,我想實現Promises到Websocket函數中。我沒有得到任何錯誤,但承諾不起作用。Javascript - 在Websocket上使用承諾?

使用下面的代碼,我可以成功連接到socketserver,但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

僅供參考:您的代碼會將'server.onopen'設置爲最後一個函數(警告失敗的函數) - 您可以將'.then'和'.catch'更改爲任何內容,它仍然可以執行相同的操作。和'var x =({})。then =({})。catch =({hello:'world'})... ... x將會是'{hello:'world'}'和中間對象與'.then'和'.catch'屬性被丟棄 –

+0

感謝您的解釋,肯定有幫助! – Piet

回答

4

您嘗試在新連接中使用promise看起來有點誤導。您將想要返回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()函數也是如此。正如你可能知道我們也有server.onmessage()函數作爲默認WebSocket的一部分。每次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.')); 

關於郵件有兩種選擇:

  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