Crawl AJAX requests in progress

1

I'm working on a page where I have a refresh button, clicking it runs a series of AJAX requests to complete the data available on the screen (4 requests to be more exact).

If the user clicks the refresh button, I would like to disable the button while all requests do not come back , because if the user clicks the button countless times generates several requests, which causes the browser crashes too (I did this test).

Is there any way to verify that the request has not yet been finalized by jQuery itself? As far as I understand, we only have .done , .fail and .always to use, and only with these checks can I not perform this validation to enable / disable the button.

I do not know if it makes any difference, but I'm making requests with the structure

$.post({},function(){});

Do you know of a solution that allows you to track whether the request is still in progress or is it not possible?

    
asked by anonymous 16.12.2018 / 05:32

1 answer

2
  

Is there any way to verify that the request has not yet been finalized by jQuery itself?

A simple way would be to add a control variable. When completing the ajax request, set a value in this variable. Do so in the 4 requisitions. In this way, use Promise .aways() of the request ajax .

  

I would like to disable the button while all requests do not come back

From here we can make a function to check if all the requests have been completed. If yes, enable the button again ...

  

I'm making requests with the $.post({},function(){}); structure

In this case, I'll use $.ajax() .

  

Recommended reading: SOen - $.post() vs $.ajax()

Theory explained, let's go to the code:

        var requisicoes = 0;

        $(function(){
            $('#btnIniciar').on('click', function(){
                $(this).prop('disabled', true); // Desabilitei o botão!

                fazerRequisicoes(); // Chamei as requisições

            });
        });

        function fazerRequisicoes()
        {

            // Requisição #1
            $.ajax({
                url: 'http://foo.bar.com.br/baz/1',
                method: 'post',
                dataType: 'html',
                // Tudo que vai passar via POST
                // Pode passar um form.serialize() também
                data: {
                    // Td que vai passar via post
                }
            })
            .done(function(ret){
                // Tudo que acontece quando terminar com sucesso
                console.log('Requisição #1 finalizada com sucesso.');
            })
            .fail(function(erro){
                // Tudo que acontece quando terminar com erro
                console.log('Requisição #1 finalizada com erro.');
            })
            .always(function(){
                // Tudo que acontece quando terminar
                // Seja com sucesso ou com erro
                // Como o nome sugere: sempre vai ser executado
                requisicoes++;
                console.log('Requisições terminadas: '+requisicoes);
                if (checaRequisicoes(4)) // Serão 4 requisições no total!
                    habilitaBtn();
            });

            // Requisição #2
            $.ajax({
                url: 'http://foo.bar.com.br/baz/2',
                method: 'post',
                dataType: 'html',
                // Tudo que vai passar via POST
                // Pode passar um form.serialize() também
                data: {
                    // Td que vai passar via post
                }
            }).done(function(ret){
                // Tudo que acontece quando terminar com sucesso
                console.log('Requisição #2 finalizada com sucesso.');
            }).fail(function(erro){
                // Tudo que acontece quando terminar com erro
                console.log('Requisição #2 finalizada com erro.');
            }).always(function(){
                // Tudo que acontece quando terminar
                // Seja com sucesso ou com erro
                // Como o nome sugere: sempre vai ser executado
                requisicoes++;
                console.log('Requisições terminadas: '+requisicoes);
                if (checaRequisicoes(4)) // Serão 4 requisições no total!
                    habilitaBtn();
            });

            // Requisição #3
            $.ajax({
                url: 'http://foo.bar.com.br/baz/3',
                method: 'post',
                dataType: 'html',
                // Tudo que vai passar via POST
                // Pode passar um form.serialize() também
                data: {
                    // Td que vai passar via post
                }
            }).done(function(ret){
                // Tudo que acontece quando terminar com sucesso
                console.log('Requisição #3 finalizada com sucesso.');
            }).fail(function(erro){
                // Tudo que acontece quando terminar com erro
                console.log('Requisição #3 finalizada com erro.');
            }).always(function(){
                // Tudo que acontece quando terminar
                // Seja com sucesso ou com erro
                // Como o nome sugere: sempre vai ser executado
                requisicoes++;
                console.log('Requisições terminadas: '+requisicoes);
                if (checaRequisicoes(4)) // Serão 4 requisições no total!
                    habilitaBtn();
            });

            // Requisição #4
            $.ajax({
                url: 'http://foo.bar.com.br/baz/4',
                method: 'post',
                dataType: 'html',
                // Tudo que vai passar via POST
                // Pode passar um form.serialize() também
                data: {
                    // Td que vai passar via post
                }
            }).done(function(ret){
                // Tudo que acontece quando terminar com sucesso
                console.log('Requisição #4 finalizada com sucesso.');
            }).fail(function(erro){
                // Tudo que acontece quando terminar com erro
                console.log('Requisição #4 finalizada com erro.');
            }).always(function(){
                // Tudo que acontece quando terminar
                // Seja com sucesso ou com erro
                // Como o nome sugere: sempre vai ser executado
                requisicoes++;
                console.log('Requisições terminadas: '+requisicoes);
                if (checaRequisicoes(4)) // Serão 4 requisições no total!
                    habilitaBtn();
            });
        }

        function checaRequisicoes(numRequisicoes)
        {
            if (requisicoes >= numRequisicoes)
                return true;
            else
                return false;
        }

        function habilitaBtn()
        {
            // Após tudo terminar, vai esperar 3 segundo pra habilitar o botão
            setTimeout(function(){
                $('#btnIniciar').prop('disabled', false);
            }, 3000);
            requisicoes = 0;
        }
<!DOCTYPE html>
<html>
<head>
    <title>Projeto secreto</title>
    <meta charset="utf-8">
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script></head><body><buttontype="button" id="btnIniciar">Iniciar requisições ajax</button>

    </body>
</html>

I made this code ignoring any good practice of aesthetics and dynamics, so be clear for a better understanding.

As I said, you can create a plugi n for ajax requests if there is similarity between your requests (not attached to the question). The purpose here is to show a simple way to "" check if your requests have been completed (with error or not) to re-enable the button.

    
16.12.2018 / 19:45