Асинхронность Ajax
Добавлено: 2013.08.19, 10:28
Здравствуйте, собственно столкнулся с такой проблемой, есть две функции которые посылают ajax запрос и получают ответ, один ожидает выполнения некого условия, а уже после его выполнения возвращает ответ, а другой выполняется с периодичностью 3 секунды, но на деле получаем ответ с сервера лишь после выполнения запроса с ожиданием.
Запросы:
1. Ожидает пока не обнаружит новую запись в базе, после чего возвращает ответ. (отправляет запрос на контроллер Polling в экшн Message)
2. Выполняется с периодичностью 3 секунды. (отправляет запрос на контроллер Checking в экшн User)
В обеих случаях async = true;
Также мне необходимо в обоих случаях в php скрипте использовать Yii::app()->user->id и Yii::app()->session['group'].
Решил пойти простым путем чтобы выяснить в чем проблема:
Ajax запрос выполняющий ожидание:
Контроллер к которому он обращается:
Второй Ajax запрос выполняющийся по с периодичностью:
Контроллер к которому он обращается:
Как я выяснил если мне необходимо в первом и во втором контроллере получить Yii::app()->user->id или Yii::app()->session['group'] я получаю синхронные запросы.
conslole.log:
Object {response: "POLLING SUCCESS"} polling.js:45
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "POLLING SUCCESS"} polling.js:45
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "POLLING SUCCESS"} polling.js:45
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "POLLING SUCCESS"} polling.js:45
Object {response: "CHECKING SUCCESS"} checking.js:40
Хотя ожидаю увидеть что то вроде этого:
conslole.log:
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "POLLING SUCCESS"} polling.js:45
Подскажите пожалуйста в чем может скрываться подвох?
Запросы:
1. Ожидает пока не обнаружит новую запись в базе, после чего возвращает ответ. (отправляет запрос на контроллер Polling в экшн Message)
2. Выполняется с периодичностью 3 секунды. (отправляет запрос на контроллер Checking в экшн User)
В обеих случаях async = true;
Также мне необходимо в обоих случаях в php скрипте использовать Yii::app()->user->id и Yii::app()->session['group'].
Решил пойти простым путем чтобы выяснить в чем проблема:
Ajax запрос выполняющий ожидание:
Код: Выделить всё
function waiting() {
$(function() {
$.ajax({
'type': 'get',
'dataType': 'json',
'url': 'http://application.com/index.php?r=polling/message',
'data': {
time: time()
},
'cach': false,
'async': true,
'success': function(data) {
console.log(data);
setTimeout(function() {
waiting();
}, 1000);
},
'error': function() {
console.log('polling error');
setTimeout(function() {
waiting();
}, 1000);
}
});
});
}
Код: Выделить всё
if (Yii::app()->request->isAjaxRequest) {
$id = Yii::app()->user->id;
$group = Yii::app()->session['group'];
for ($i = 0; $i <= 5; $i++) {
sleep(1);
}
echo CJSON::encode(array('response' => 'POLLING SUCCESS'));
Yii::app()->end();
} else {
print "no ajax";
}
Код: Выделить всё
function checkOnlineUsers() {
$(function() {
$.ajax({
'type': 'get',
'dataType': 'json',
'url': 'http://application.com/index.php?r=checking/user',
'cach': false,
'async': true,
'success': function(data) {
console.log(data);
setTimeout(function() {
checkOnlineUsers();
}, 3000);
},
'error': function() {
console.log('Checking error');
setTimeout(function() {
checkOnlineUsers();
}, 3000);
}
});
});
}
Код: Выделить всё
if (Yii::app()->request->isAjaxRequest) {
$id = Yii::app()->user->id;
$group = Yii::app()->session['group'];
echo CJSON::encode(array('response' => 'CHECKING SUCCESS'));
Yii::app()->end();
} else {
print "no ajax";
}
conslole.log:
Object {response: "POLLING SUCCESS"} polling.js:45
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "POLLING SUCCESS"} polling.js:45
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "POLLING SUCCESS"} polling.js:45
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "POLLING SUCCESS"} polling.js:45
Object {response: "CHECKING SUCCESS"} checking.js:40
Хотя ожидаю увидеть что то вроде этого:
conslole.log:
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "CHECKING SUCCESS"} checking.js:40
Object {response: "POLLING SUCCESS"} polling.js:45
Подскажите пожалуйста в чем может скрываться подвох?