Значение myIdentity создается только один раз и сохраняется в локальном хранилище после первого использования следующего контроллера Angular.js.Проблема с состоянием гонки betwen 2 Контроллеры в Angular.js с Ajax и localStorage value
Функция $ scope.createIdentity() является сложной функцией в более глобальном контроллере и сохраняет результат в $ localstorage.myIdentity. Это прекрасно работает !!! Функция createIdentity() работает с Q-предложением для себя. Но в AppCtrl у меня проблема с условиями гонки, потому что $ localstorage.myIdentity еще не разрешен до мой запрос HTTP http XHR уволен. Поэтому он не содержит значения myId.
Это происходит только при первом использовании контроллера.
Но мне нужно запустить соединение socket.io при первом вызове AppCtrl, и это для меня большая проблема.
При втором использовании AppCtrl правильное значение myIdentity доступно еще в $ localStorage.
TimeacleControllers.controller('StatusCtrl', ['$scope', '$http', 'Socket', '$localStorage',
function ($scope, $http, Socket, $localStorage) {
if ($localStorage.myIdentity === undefined) {
$scope.createIdentity();
}
var myParams = {
myId: $localStorage.myIdentity
};
$http
.post('http://example.org', myParams)
.success(function (data) {
console.log('received data: ' + data);
Socket.connect();
Socket.on('connected', function() {
console.log("Connection!");
});
Socket.on('message', function (msg) {
console.log("Message: " + msg);
});
})
.error(function (err) {
// Handle login errors here
console.log("Error - " + err);
});
}]);
Так что вы можете сделать здесь, чтобы сделать запрос Ajax ждать, пока $ localstorage.myIdentity не может быть решена? Пожалуйста помоги.
Если у вас есть эти ограничения, возможно, вам необходимо реорганизовать. Используйте службу для createIdentity и что-то вроде getid. Вы можете использовать обещание начать ваши вызовы сокетов, которые вы даже можете разрешить в маршрутизаторе, прежде чем маршрут будет изменен, если это необходимо. – jme11