long polling ajax no esta funcionando bien

Iniciado por geshiro, 25 Abril 2017, 01:24 AM

0 Miembros y 4 Visitantes están viendo este tema.

geshiro

lo hace este script es que cuando cambio algo en la base de datos automaticamente se refleja en el sitio solo que cuando agrego un elemento a la base de datos cada ves tengo que recargar la pagina como pudiera hacer para solucionar esto? otra cosa en mi timestamp en la consola de google chrome parece asi http://localhost/storelte/notify/pusher?timestamp=1493076211  pending pero al agregar el nuevo elemento no cambia el timestamp porq no lo hace automatico tengo que recargar para verlo no se que estoy haciendo mal en el ajax ,
Código (javascript) [Seleccionar]
$(function(doc, win, $) {
    var has_focus = true;
    var notification = win.Notification || win.mozNotification || win.webkitNotification;
    var $badge = $("#notifications-badge");
    var $list = $("#notifications-list");
    var $button = $("#notifications-button");
    URL_GET_NOTIFICATION = BASE_URL + 'notify/pusher';
    URL_GET_NOTIFICATION_UPDATE = BASE_URL + 'notify/update';

    if ('undefined' === typeof notification) {
        console.log('Web notification not supported');
    } else {
        notification.requestPermission(function(permission) {});
    }

    function check_notifications(timestamp) {
        $.ajax({
            type: 'GET',
            url: URL_GET_NOTIFICATION,
            data: { timestamp : timestamp },
            dataType: 'json',
            async: true,
            success: function (data) {
                for (var i in data.notifications) {
                    notify(data.notifications[i].message, data.notifications[i].type, data.notifications[i].timestamp);
                }
                check_notifications(data.timestamp);
            }
        });
    }

     function notify(message, type, created_at) {
        var type_txt = 'info';
        var url = '#';
        var icon = 'info-circle';

        if (type == 0) {
            type_txt = 'success';
            icon = 'check';
        } else if (type == 1) {
            type_txt = 'info';
            icon = 'exclamation';
        } else if (type == 2) {
            type_txt = 'warning';
            icon = 'exclamation-triangle';
        } else if (type == 3 || type == 4) {
            type_txt = 'danger';
            icon = 'fire';
        }

        $badge.show();
        $badge.text(parseInt($badge.text()) + 1);

        $list.find(".item").eq(13).nextAll(".item").remove();
        var item = '<li class="item text-' + type_txt + '"><a href="' + url + '"><span class="text-' + type_txt + '">' +
            '<i class="fa fa-' + icon + ' fa-fw"></i> ' + message.substr(0, 22) + '</span>' +
            '<span class="pull-right text-muted small" data-time="' + created_at + '">X</span></a></li>' +
            '<li class="item divider"></li>';
        $list.prepend(item);

        $('.dropdown.open .dropdown-toggle').dropdown('toggle');

        return true;
    }

    $(win).on("blur", function () {
        has_focus = false;
    });

    $(win).on("focus", function () {
        has_focus = true;
    });

    $button.on("click", function () {
        $badge.fadeOut(300, function () {
            $badge.text(0);
        });
       
        $list.find("span[data-time]").each(function (index) {
            var $this = $(this);
            $this.text(moment.unix($this.data('time')).fromNow());
        });
    });

    check_notifications();
}(document, window, jQuery));

$('#notifications-button').on('click', function () {
    $.ajax({
        type: 'GET',
        url: 'http://localhost/storelte/notify/update',
        success: function(data){
        }
    });
});


engel lex

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

geshiro

#2
lo dejo abierto en espera de un cambio en la base de datos y en google chrome me lo deja asi
pusher?timestamp=1493077051   (pending)   xhr   jQuery-2.1.4.min.js:4   0 B   Pending

engel lex

no veo el error, del todo, puedes colocar una captura de tu consola? para ver que peticiones hizo antes
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

geshiro

#4
asi se ve cuando queiro agregar un nuevo elemento queda igua si no recargo como arreglaria mi ajax https://drive.google.com/open?id=0B5jZAeoqf_UiVGJ5ZXk0UENucUE

engel lex

el servidor te está dejando en visto XD

que back end tienes? un php normal?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

geshiro

#6
en backend tengo php con codeigniter, lo que pasa es que cuando inserto una notificacion desde mysql deberia ser vista en la web sin recargar ese es el problema q no lo esta haciendo porq tengo q recargar

Código (php) [Seleccionar]
public function pusher(){
$data = $this->session->userdata('log');
$user_id = $data['id'];
header('Content-Type: application/json');
set_time_limit(0);
while (true) {
$firstCall = false;
if ($this->input->get('timestamp')) {
$last_ajax_call = $this->input->get('timestamp');
}else{
$last_ajax_call = time();
            $firstCall = true;
}

clearstatcache();
$notificationsCount = $this->notification->checkForNotifications($user_id, $last_ajax_call);
$newData = (int) $notificationsCount > 0 ? true : false;
$notifications = [];
if ($newData) {
$dataSet = $this->notification->getNotifications($user_id, $last_ajax_call);
foreach ($dataSet as $value) {
$notifications[] = $value;
$finalNotificationTime = $value['timestamp'];
}

$result = array('notifications' => $notifications, 'timestamp' => $finalNotificationTime);
$json = json_encode($result);
echo $json;
break;
}else{
if ($firstCall) {
$dataSet = $this->notification->getUnreadNotifications($user_id);
foreach ($dataSet as $value) {
$notifications[] = $value;
}

$result = array('notifications' => $notifications, 'timestamp' => $last_ajax_call);
$json = json_encode($result);
echo $json;
break;
}

sleep( 1 );
           session_write_close();
           continue;
}
}
exit();
}

engel lex

set_time_limit(0)
while(true)
exit()
sleep(1)

que es eso geshiro!? eso solo se usa casi que para debug... (excepto time limit que se usa para largas data frame, y aquí no es el caso)

lo unico que te altó fue error_reporting(0)

no se para que tienes ese while ahí, para mi está pegado en ese while, cuantas veces se va a repetir ese get si nunca debería repetirse, si se manda data se mando y adiós! no es socket, es htttp
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

geshiro

#8
set_time_limit(0) Limitamos  el tiempo máximo de ejecución  para que el sleep solo de 1s
while(true) un ciclo infinito que en ves que estar pidiendo request cada 3s o 5s lo hize infinito con un estado de pending
exit() terminamos el ciclo infinito
sleep(1) delays de 1s

es lo mas cerca que pude hacer al websocket ya que short polling me iba a hacer request cada 3s o 5s para que lo hize long polling cuando se haga una alteracion a la base de datos , con un efecto similar al websocket pero es http

Código (php) [Seleccionar]

{"notifications":[{"user_id":"1","notification_id":"105","timestamp":"1493078569","id":"105","product_id":"4232","message":"1","type":"1","created_at":"1493078569","status":null}],"timestamp":1493080187}


y este json es lo que me regresa el ciclo

engel lex

eeehm no... es http... ahí no hay socket... cada conexión cierra estado, cada script tiene su propia data estatica...

por eso se pega... a demás... aunque fuera socket, no estás dando salida a los datos... echo solo pasa la data a el buffer... y si te pones a vaciar buffer vas a crear caos...
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.