我想创建一个与socket.io一起使用的angularJS承诺。我目前有一个回调设置来处理响应:
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) {
...
});
我想知道我们是否可以使用承诺(使用角度为$ q的服务):
request('myEvent', 'Hello World !').then(function(data) {
});
谢谢!
答案 0 :(得分:2)
您可以尝试类似
的内容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) {
});
答案 1 :(得分:1)
function request (eventName, data) {
return $q(function (resolve, reject) {
socket.emit(eventName, data);
socket.on(eventName, function (data) {
socket.off(eventName);
resolve(data);
});
});
}
答案 2 :(得分:1)
如果你的事件只有一次发射就可以了,那么你可以答应它。
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(....)
答案 3 :(得分:0)
当我在一个函数中包装socket.on(event)时,我遇到了问题,并且多次调用该函数将打开其中的多个函数。因此,当后端调用特定的套接字事件时,会多次调用socket.on(event)。如果使用$ 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服务中。要从socket.on('search')获取数据,您可以执行以下操作:
SocketioService.search('Some query').then( (data) => {
//do something with the data from the backend
})
不确定这是否是最佳解决方案,但它有效:)