Boas-vindas ao Power Pixel

Junte-se a comunidade! Crie o seu próprio conteúdo, e faça amizades.EntrarCriar uma conta

Desafio de código!

2 participantes

JScript JScript  • Ter 24 Fev 2015 - 12:43

Desafio de código! Empty Desafio de código! Ter 24 Fev 2015 - 12:43

Bom, aqui está um desafio na qual pretendemos 3 coisas:
1- Não ter o request limit
2- Não travar a interface do navegador
3- Executar o mais rápido possível

Vejam abaixo um exemplo do código que uso para remover todas as postagens do meu perfil:
Código:

var TID = $('a[href*="tid="]').attr("href").split("tid=")[1].split("&")[0],
   userWall = "/u2497wall",
   user_name = "JScript";

var dataRead = function(callback) {
   $.ajax({
      url: userWall,
      cache: false,
      type: "get",
      dataType: "text",
      success: callback
   });
};
var clearMsgs = function() {
   dataRead(function(response, status, xhr) {
      if (xhr.status == 200) {
         try {
            var page = $('#profile-advanced-details .pagination.top:first a[href^="' + userWall + '?start="]:not(:last)', response),
               msg = $("#profile-advanced-details ul li.last a", response),
               i = 0, len = msg.length;
               
            for (; i < len; i++) {
               var split = $(msg[i]).attr("href").split("=");
               
               (function(split, i) {
                  setTimeout(function() {
                     $.ajax({
                        url: split[0] + "=" + split[1],
                        type: "post",
                        data: {
                           d: split[1],
                           confirm: 1,
                           tid: TID
                        }
                     });
                  }, (500 * i) + (page.length + 100));
                  
               })(split, i);
            }
            if (page.length !== 0) {
               setTimeout(clearMsgs, 100 * page.length);
            }
         } catch (e) {}
      }
   });
};
clearMsgs();

Esse foi o máximo que cheguei e com 28 páginas cada uma com 10 postagens, levou 8 segundos para remover todas as mensagens em uma conexão de 15mb GVT

Quem poder aperfeiçoar o código acima, ficaremos gratos por isso!

JS

waghcwb waghcwb  • Ter 24 Fev 2015 - 14:25

Desafio de código! Empty Re: Desafio de código! Ter 24 Fev 2015 - 14:25

Olá amigo,

O que eu faria neste caso, é mudar a forma com que você lê essas mensagens para uma forma onde você vai poder ler todas as mensagens do chat e não apenas algumas. E também terá um controle total das mensagens, podendo editar, e mostrar da maneira que quiser para os visitantes.

Invés de uma mensagem por cada postagem no chat, você poderia usar uma única mensagem para todas as mensagens do chat. Veja esse exemplo:
Código:
;(function($, window, document, undefined) {

    function Chatbox(options)
    {
        var self = this;

       self.options = options;

        self.readMessages = function()
        {
            $.ajax({
                url: '/u' + self.options.user + 'wall',
                cache: false,
                type: 'GET',
                dataType: 'text',
               
                success: function(data)
                {
                    var messages = $('#profile-advanced-layout .message-block .message-text', data).text();
                        messages = JSON.parse(messages);

                    self.callback(messages);

                },

                error: function(xhr, options, error)
                {
                    alert('Erro!!\nTente novamente em alguns segundos...\n\n' + error);
                }
            });
        };

        self.callback = function(data)
        {
            var i = data.messages.length - 1;
            var messages = document.getElementById('messages');

            for(; i >= 0; i--) {
                var message = document.createElement('div');
                    message.innerHTML = data.messages[i].date + ' ' + data.messages[i].username + ': ' + data.messages[i].message;
                    messages.insertBefore(message, messages.firstChild);
            }
        };
    }


    var options = {
        user: 517
    }

    var chatbox = new Chatbox(options);

    $(function() {
        chatbox.readMessages();
    });


})(jQuery, window, document);

Veja as mensagens lá no meu perfil: [Tens de ter uma conta e sessão iniciada para poderes visualizar este link]

E aqui elas sendo lidas
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link]

Acesse na guia privada e vai ver que até mesmo os visitantes podem ver, como o efeito atual!!

O que me diz? Você limita esse monte de request a um único request para ler os dados. E no caso de apagar, só um também, pois precisa unicamente apagar aquela postagem especifica.

E com isso, você "abre as portas" para usar esse esquema do BD ai em outros códigos também, e não única e exclusivamente para o chatbox!!

JScript JScript  • Ter 24 Fev 2015 - 15:06

Desafio de código! Empty Re: Desafio de código! Ter 24 Fev 2015 - 15:06

A ideia é interessante sim, mas veja que cada indivíduo que postar uma mensagem no chat, uma postagem será dado no perfil, correto?
Se nesse momento eu pegar todas as mensagens do chat e postá-las em uma só postagem no perfil, com certeza vai diminuir a quantidade de mensagens no perfil, e nesse caso bastaria ler a primeira da lista do perfil que daria certo, ok?

Mas o problema não está sendo a leitura das mensagens no perfil, mas sim no momento em que tenho que removê-las quando é dado um /cls no chat, entende?

JS

waghcwb waghcwb  • Ter 24 Fev 2015 - 15:11

Desafio de código! Empty Re: Desafio de código! Ter 24 Fev 2015 - 15:11

Entendi.

Nesse caso, não sei uma maneira eficiente de faze-lo... Acredito que o que já fez é o máximo que podemos alcançar na plataforma. Sem passar pelo Request Limit. Eu mesmo não faria assim, eu deixaria as ações que precisam ser feitas no storage, e em algum momento oportuno quando nenhum request estiver sendo feito, ai sim eu faria essa atualização. Mas, ai você perde o elemento "em tempo real"...

Espero que alguém tenha uma idéia melhor para colaborar conosco!

JScript JScript  • Ter 24 Fev 2015 - 15:20

Desafio de código! Empty Re: Desafio de código! Ter 24 Fev 2015 - 15:20

Eu já tinha pensado em salvar todas as mensagens do chat de uma vez só, mas cada pessoa que postar algo no chat, requer uma postagem no perfil, entende?
Até ai não tem problema, poderia ser dessa forma ou da que eu estou fazendo, o problema maior é remover as mensagens do perfil!!
Se no "wall" tivesse ao menos uma opção de moderação e que pudéssemos remover todas ao mesmo tempo, ai sim...

Aqui está um exemplo de loop assíncrono, no qual estou usando no código:
Código:

console.clear();
for (var i = 0; i < 10; i++) {

 (function(i) {
 setTimeout(function() {
 console.log(i);
 }, 500 * i);

 })(i);
}

Executa no console pra ver o resultado.

Se eu ativar o modo síncrono no ajax, dá verto, nunca vai dar o request limit, mas a interface do navegador fica travada até que a última mensagem seja apagada!!!

JS

waghcwb waghcwb  • Ter 24 Fev 2015 - 17:20

Desafio de código! Empty Re: Desafio de código! Ter 24 Fev 2015 - 17:20

Será que isso não seria útil no caso amigo?
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link]

Andei fazendo uma pesquisa, e encontrei alguns usuários que estavam sofrendo com esse "travamento", alguns deles solucionaram o problema com isso.

Aqui tem mais conteúdo que encontrei e estou estudando (até porque até o momento não usei isso ainda!)...
[Tens de ter uma conta e sessão iniciada para poderes visualizar este link]

Conteúdo patrocinado  • 

Desafio de código! Empty Re: Desafio de código!

Permissões neste sub-fórum
Não podes responder a tópicos