有 promise 的 Javascript (Angularjs) websocket?

标签 javascript angularjs

我在项目中使用 Angularjs。我将 $q.all 与来自 $http 的多个请求一起使用,它的工作。

在新的案例中,我使用了 websocket,但我不知道如何将 promises 与 websocket 一起使用。

$http 返回 promise ,但 websocket 不是。

Websocket 示例:(这不是真正的代码)

我发送的pack id是1000,我revice的pack id是2000。

websocket.send(1000);

websocket.onMessage(data) {
  if (data.id == 2000) {
    // do something
  }
}

我去用 websocket 使用 Promises,这可能吗?

最佳答案

您可以设置一个基本的请求/响应 reactor并用 promise 包装它。

设置 react 器:

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
});

你也可以使用 onerroronclose 在适当的地方做 $q.reject 这样 websocket 错误可以返回到 promise 。

这是一个使用上述技术的简单 websocket 回显示例:http://plnkr.co/edit/ORSqXz07I9cLspZQg1iM?p=preview

关于有 promise 的 Javascript (Angularjs) websocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25235784/

相关文章:

javascript - Jquery .load - 从index.php到index.html相同域获取<div>特色产品(opencart)

javascript - 以 Angular 观察 Controller 之间的变化

javascript - addClass 隐藏在 ng-click angularJS 中

javascript - Alasql 未定义

javascript - GraphQL AWS Amplify @connection 未引入连接数据

javascript - 难以实现拦截器来处理刷新 token

javascript - 动态改变表单值

android - 输入值不更新

javascript - "heroku run fileName"构建后

javascript - 选择字符串中的特定字符并使用 Jquery(视觉上)对其进行偏移