我在一个项目中使用
Angularjs.我使用$q.all和来自$http的多个请求,这是有用的.
在新的情况下,我使用websocket,但我不知道如何使用websocket的promises.
$http返回promises,但websocket不是.
Websocket示例:(这不是真正的代码)
我发送包ID是1000,我修改包ID是2000.
websocket.send(1000); websocket.onMessage(data) { if (data.id == 2000) { // do something } }
我开始使用带有websocket的Promises,这可能吗?
解决方法
你可以设置一个基本的请求/响应
reactor并用promises包装它.
设置反应堆:
var callbacks = {}; websocket.onmessage = function(event) { var data = angular.fromJson(event.data); if (angular.isDefined(callbacks[data.request_id])) { var callback = callbacks[data.request_id]; delete callbacks[data.request_id]; callback.resolve(data); } else { $log.error("Unhandled message: %o",data); } };
请求功能:
var requestId = 0; $scope.getRequestId = function() { return requestId++; }; $scope.request = function(data) { var request = { request_id: $scope.getRequestId(),data: data }; var deferred = $q.defer(); callbacks[request.request_id] = deferred; websocket.send(angular.toJson(request)); return deferred.promise.then(function(response) { request.response = response; return response; }); };
示例用例可能是:
$scope.request("My Request").then(function(response) { // do something with response });
您还可以使用onerror和onclose在适当的位置执行$q.reject,以便websocket错误可以使其返回到promise.
这是一个使用上述技术的简单websocket echo示例:http://plnkr.co/edit/ORSqXz07I9cLspZQg1iM?p=preview