Я использую angularjs для веб-сайта, где мне приходится загружать данные каждую секунду.Для этого я использую WebSocket, проблема в том, что я отправляю много разных запросов разных типов.Для разработки запроса я использую Promises, но иногда ответы получаются не на ту функцию.Позвольте мне привести пример:
Итак, у меня есть служба, которая делает запрос и получает результат как Promise.
socketService.$inject = [];
function socketService(){
let service = this;
let server = new WebSocket('ws://localhost:8090');
let isOpen = false;
server.onopen = function(){
isOpen = true;
};
server.onerror = function(){
//TODO handle error
};
service.sendRequest = function(action, data){
return new Promise(function (resolve, reject) {
if (isOpen) {
server.send(encodeRequest(action, data));
server.onmessage = function (message) {
resolve(JSON.parse(message.data));
}
}
server.onopen = function () {
server.send(encodeRequest(action, data));
server.onmessage = function(message) {
resolve(JSON.parse(message.data));
isOpen = true;
}
};
server.onerror = function (error) {
reject(error);
}
})
};
}
И я использую его так:
socketService.sendRequest('get_events', {})
.then(function (response) {
//DO SOMETHING WITH THE RESPONSE
return socketService.sendRequest('get_history', {
fromDate: value,
toDate : value,
tag : value,
event : value
})
})
.then(function (response) {
//DO SOMETHING WITH THE RESPONSE
});
Проблема в том, что если я выполняю такие запросы (когда одно обещание разрешено, я вызываю другое, то оно отлично работает), но если вместо этого я выполняю, например, несколько запросов каждую секунду, а затем в то же время я делаю новоезапрос (socketService.sendRequest(...)
) результаты запутались.
Я выяснил, что проблема в том, что, если я делаю запрос и перед тем, как получить результат первого запроса, я делаю другой, ответ первого запроса переходит ко второму.
Я не понимаю, почему это происходит, потому что я каждый раз возвращаю новое Обещание, поэтому он должен разрешить ответ этого Обещания вместо того, чтобы разрешать ответ следующего Обещания.
Я прочитал это однажды обещаниерешен, он не может быть использован снова (он возвращает последний результат снова и снова), но я каждый раз создаю новый.
Может кто-нибудь объяснить мне, что происходит и как я мог это исправить?