Асинхронность Ajax

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Oleg_Korchickiy
Сообщения: 1
Зарегистрирован: 2013.08.19, 09:42

Асинхронность Ajax

Сообщение Oleg_Korchickiy »

Здравствуйте, собственно столкнулся с такой проблемой, есть две функции которые посылают ajax запрос и получают ответ, один ожидает выполнения некого условия, а уже после его выполнения возвращает ответ, а другой выполняется с периодичностью 3 секунды, но на деле получаем ответ с сервера лишь после выполнения запроса с ожиданием.

Запросы:
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";
        }
 
Второй 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";
        }
 
Как я выяснил если мне необходимо в первом и во втором контроллере получить 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

Подскажите пожалуйста в чем может скрываться подвох? :?
Аватара пользователя
Loki
Сообщения: 65
Зарегистрирован: 2011.01.16, 10:47
Откуда: Омск

Re: Асинхронность Ajax

Сообщение Loki »

Сессии блокируются и пока не закрыл старую – новую открыть не даст.
Об этом писал SamDark.
Ответить