Problems between loop and ajax

2

Ajax

for (j=0; j < cidade_nome.length; j++) {
    $.post('envia.php', {ano:ano, ano2:ano2, cidade: cidade_nome[j].value}, fnRetorno);
}

Function fnRetorno

function fnRetorno(retorno) 
{
    teste.push(retorno);
    console.log(j);
    if (j == cidade_nome.length) {
        soma(teste);
    }
}

Full Code

function soma(teste) 
{
    console.log(JSON.parse(teste));
}

function fnRetorno(retorno) 
{
    teste.push(retorno);
    console.log(j);
    if (j==cidade_nome.length) {
        soma(teste);
    }
}

for (j=0;j<cidade_nome.length;j++) {
    $.post('envia.php', {ano: ano, ano2: ano2, cidade: cidade_nome[j].value}, fnRetorno);
}

Because ajax is asynchronous, the fnRetorno function calls the sum function, before the last ajax result is placed in the teste array.

Would there be any way to ensure that the test function sum would only be called after ajax runs every time through the loop?

    
asked by anonymous 19.02.2015 / 17:08

3 answers

1

In your case, you can do something much simpler than what you're doing, and avoid so many unnecessary posts, something like:

function soma(teste) 
{
    console.log(JSON.parse(teste));
}

function fnTest(data, pos) 
{
    teste.push(data, pos);
    if (pos==cidade_nome.length) {
        soma(teste);
    }
}

var data_post = {};
    for (var i in cidade_nome) {
         data_post[i] = {ano: ano, ano2: ano2, cidade: cidade:cidade_nome[i].value};
           fnTest(data_post[i], i);
        } 

    $.post('envia.php',data:data_post, function(rtn) {
          console.log(JSON.parse(rtn));
     });

And in PHP you do the deal you need:

<?php
//captura a saída e veja o que retorna para fazer a tratativa 
var_dump($_POST['data']);
exit;
    
18.08.2015 / 21:14
0

I think the most correct approach in your case would be:

function fnRetorno(j) {

    if (j >= cidade_nome.length) return;

    $.post('envia.php', {..., cidade: cidade_nome[j].value}, function ()
    {
        // Não sei de onde vem a variável 'teste'
        soma(teste);

        fnRetorno(++j);
    })

};

fnRetorno(0);

In this case, you will call the next ajax call only when the previous one is closed.

Notice that the j was passed by parameter. This helps to reduce the pollution of the scope of your code, as well as doing exactly the same thing as for , which is iterate until the element is equal to cidade_nome .

    
18.08.2015 / 20:27
0

Good morning Rodolfo try it this way:

$.ajax({
    //função ajax
}).done(function () {
    //função após o ajax
});

This is another way, where you guarantee a call after the ajax return

    
18.05.2018 / 15:45