2016-08-13 2 views
0

В настоящее время я использую Node.js в качестве сервера (Express.js) и AngularJs на стороне клиента, переключившись с HTTP-API на WebSockets (используя Socket.io) из-за улучшения производительности.Управление потоками WebSockets с использованием Promises

Поскольку WebSockets не имеет кодов состояния/управления ошибками и просто возвращает JSON с необязательным обратным вызовом, я должен реализовать это управление ошибками. Я хочу поведение консистенции при возникновении ошибки, и вместо того, чтобы делать эту ошибку вручную, я хочу обернуть ее, чтобы уменьшить киля в моем коде, используя обещания по плохой старой базе данных.

Например, вместо использования сырой 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 при реализации request- ответ API на основе WebSockets? Или есть библиотека, которая может это сделать для меня?

Я в настоящее время думает о JSON с этой структурой в ответ:

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

Я думаю, что работает с WebSockets использования Обещания вместо обратных вызовов является одним из основного и obious требования, но по какой-то причине все библиотеки, которые я нашел, не завернули обратные вызовы с помощью обещаний, что приводит меня к вопросу, если я чего-то не хватает?

Благодаря

+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-(обновления) –

ответ

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

Я не уверен, если его что вы хотите, но теперь вы можете сделать STH как:

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

Однако вы должны заменить «calltheserver()» с реальной функции ,

0

Вот как я реализовал его до сих пор на стороне клиента (непроверенный), не уверен, есть ли лучшая библиотека или решение для адресации API запросов-ответов на основе Websocket.

Client Side Code (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); 
}) 

;

Смежные вопросы