AngularJS$q承诺使用socket.io

AngularJS $q promise with socket.io

本文关键字:socket io 承诺 AngularJS      更新时间:2023-09-26

我想创建一个angularJS promise,它可以与socket.io一起使用。我目前有一个回调集来处理响应:

function request(event, data, callback) {
    socket.emit(event, data);
    socket.on(event, function(d) {
        socket.off(event);
        callback(d);
    });
}

这迫使我写这样的东西:

request('myEvent', 'Hello World !', function(data) {
    ...
});

我想知道我们是否可以使用一个承诺(从angular提供$q服务):

request('myEvent', 'Hello World !').then(function(data) {
});

谢谢!

您可以尝试类似的东西

function request(event, data) {
    var deferred = $q.defer();
    socket.emit(event, data);
    socket.on(event, function(d) {
        socket.off(event);
        deferred.resolve(d);
    });
    return deferred.promise;
}

然后你可以使用

request('myEvent', 'Hello World !').then(function(data) {
});
function request (eventName, data) {
  return $q(function (resolve, reject) {
    socket.emit(eventName, data);
    socket.on(eventName, function (data) {
      socket.off(eventName);
      resolve(data);
    });
  });
}

well promise只能解析或拒绝一个。事件会不止一次发生吗?你在乎它是否比发生得更多吗

如果你的活动只开了一次,那么你可以承诺是的。

function request(event, data, callback) {
    socket.emit(event, data);
    socket.on(event, function(d) {
        socket.off(event);
        callback(d);
    });
}

变为:

function request(event, data) {
    return $q(function(resolve, reject) {
       socket.emit(event, data);
       socket.on(event, function(d) {
           socket.off(event);
           resolve(d)
       });
    });
}

您将使用它:

request('event', data).then(....)

我在一个函数中包装socket.on(event)并多次调用该函数时遇到了问题,它将打开多个函数。因此,当后端调用特定的套接字事件时,socket.on(事件)会被多次调用。如果使用$rootScope修复了此问题$在其上只能有一个实例。

this.search = (query) => {
    var deferred = $q.defer();
    socket.emit('search', {query: query}) // send data to backend
    $rootScope.$on('search', function(event,data){
        deferred.resolve(data);
    });
    return deferred.promise;
}
//get data back from backend
socket.on('search',(data) => {
    $rootScope.$emit('search',data);
}); 

漏洞代码封装在Angularjs服务中。现在要从套接字获取数据。在('search')上,你可以做这样的事情:

SocketioService.search('Some query').then( (data) => {
  //do something with the data from the backend
})

不确定这是否是最好的解决方案,但它有效:)