2016-08-13 56 views
0

我目前在客戶端使用Node.js作爲服務器(Express.js)和AngularJs,由於性能改進,從基於HTTP的API切換到WebSockets(使用Socket.io)。使用Promises的WebSockets控制流程

由於WebSockets缺少狀態代碼/錯誤管理,只是用可選的回調函數返回JSON,所以我必須實現這種錯誤管理。 當發生錯誤時,我想要一個一致的行爲,而不是手動進行此錯誤檢查我想包裝它以減少代碼中使用Promise而不是基於舊的基於回調的代碼中的boilplate。

例如代替角使用原始socket.io:

socket.emit('users/read', {id: 2}, function handleResponse(res){ 
    if(res.success){ 
     var user = res.data; 
     socket.emit('projects/by-user', {userId: user.id}, function handleResponse(res){ 
      if(res.success){ 
       var projects = res.data; 
       // Do something with the data 
      } else{ 
       // Error getting user's projects 
       console.log(res.error) 
      } 
     }) 
    } else{ 
     // Error getting user 
     console.log(res.error) 
    } 
}) 

我想有這樣的事情:

webSocketClient 
    .request('users/read', {id:2}) 
    .then(function(user){ 
     return webSocketClient.request('projects/by-user', {userId: user.id}) 
    }) 
    .then(function(projects){ 
     // Do something with projects 
    }) 
    .catch(function(err){ 
     // Something went bad 
    }) 

什麼是推薦的JSON結構實現請求 - 當響應基於WebSockets的API?或者有一個圖書館可以爲我做這個?

我目前認爲,有關此結構的JSON響應:

{ 
    success: true/false, 
    data: [if exists], 
    statusCode: [default 200 for success or 500 for failure], 
    error: [if exists] 
} 

我認爲,隨着使用的,而不是回調的WebSockets的承諾是根本,obious要求工作,但由於某些原因,所有的我發現的圖書館沒有用Promises包裝回調,這導致了我是否錯過了某些問題?

感謝

+0

爲什麼不寫你自己的承諾? –

+0

可能重複的[我如何使用Socket.IO與承諾?](http://stackoverflow.com/questions/21768219/how-can-i-use-socket-io-with-promises) –

+0

@ jfriend00有一個內置的方式來支持回覆/確認使用回調,所以標籤將不需要http://socket.io/docs/#sending-and-getting-data-(acknowledgements) –

回答

0
var ownhandler={}; 
ownhandler.request(query){ 
o={}; 
o.query=query; 
o.then=function (callback){ 
    calltheserver(this.query,function(){ 
     callback(); 
    } 
}; 
return o; 
} 

林不知道如果你想要什麼,但現在你可以做某事,如:

ownhandler.request("whatever").then(function(){ 
//function finished 
} 

但是你有一個真正的功能,以取代「calltheserver()」 。

0

這是我迄今在客戶端(未經測試)實現它的方式,不確定是否有更好的庫或解決方案來處理基於Websocket的請求響應API。

客戶端代碼(Angular.js)

angular.module('app.web-sockets', []) 
.factory('wsClient', function createWebSocketClient(socket, $q, assert, $timeout) { 
    function WebSocketClient(socket) { 
     this._socket = socket; 
    } 

    WebSocketClient.prototype.request = function request(url, data, options) { 

     var wrappedRequest = { 
      data: data 
     }; 

     var deferred = $q.defer(); 
     var resolved = false; 

     socket.emit(url, wrappedRequest, function responseCallback(response) { 
      if (response.success) { 
       deferred.resolve(response.data); 
       resolved = true; 
      } else { 
       deferred.reject(response); 
       resolved = true; 
      } 
     }); 

     return deferred.promise; 
    }; 

    return new WebSocketClient(socket); 
}) 

;