2016-05-16 92 views
0

我想創建一個angularJS承諾與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) { 
    ... 
}); 

我不知道是否我們可以使用一個承諾(與角$ Q服務) :

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

}); 

謝謝!

+0

以及承諾不僅可以解決或拒絕。這件事會不會發生一次?你是否在乎它是否發生了多於那些? –

+0

讓我們說事件一個接一個地開火。 – Arpp

回答

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) { 

}); 
+0

完美!謝謝 :)。 – Arpp

1
function request (eventName, data) { 
    return $q(function (resolve, reject) { 
    socket.emit(eventName, data); 
    socket.on(eventName, function (data) { 
     socket.off(eventName); 
     resolve(data); 
    }); 
    }); 
} 
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(....) 
0

我有問題,當我在一個函數包socket.on(事件),並調用該函數不止一旦它將打開它們的多個。所以當後端調用特定的套接字事件時,會多次調用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獲得的數據(「搜索」),你可以做這樣的事情:

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

不知道這是最好的解決方案,但它的工作原理:)