J'essaie de régler ce problème depuis 2 jours. Mais les choses ne semblent pas marcher pour moi.

Le code que j'ai attaché fonctionne bien en dehors de la boucle mais quand je l'utilise à l'intérieur de la boucle, il ne fonctionne tout simplement pas comme je le souhaite et enregistre un tableau vide dans la console.

D'un côté non, l'utilisation de "async: false" à l'intérieur de ma requête ajax fait que le code fonctionne correctement et génère un tableau complètement fin dans la console, mais comme vous le savez, l'utilisation de "async: false" est obsolète et gèle complètement l'interface utilisateur jusqu'à ce que la requête ne soit pas terminé.

D'autres solutions plutôt que de définir async sur false?

for (var i = 0; i <= splittedURLSLength; i++) {
            var extracted = extractUsername(splittedURLS[i]);
            postData = {'name' : extracted};
            ajaxRequest = $.when( $.ajax({
            url: "/check",
            type: "POST",
            data: postData
            })).then(function(returnedResponse) {
                if (returnedResponse == "1") {
                    resultsArray.push(extracted);
                }   
            });
}
console.log(resultsArray);
0
abhanan93 7 mars 2016 à 18:52

3 réponses

Meilleure réponse

Juste une autre idée pour le résoudre ...

var resultsArray[]//Global or should be pass to the function...

myIterate(0);

function myIterate(idx){
    var i = idx;
    if (i < splittedURLS.length){
        var extracted = extractUsername(splittedURLS[i]);
        postData = {'name' : extracted};
        ajaxRequest = $.when( $.ajax({
        url: "/check",
        type: "POST",
        data: postData
        })).then(function(returnedResponse) {
            if (returnedResponse == "1") {
                resultsArray.push(extracted);
                myiterate(i++);
            }   
        });
    }
}
console.log(resultsArray);
0
DIEGO CARRASCAL 7 mars 2016 à 16:23

Le problème auquel vous êtes confronté est que vous vous connectez resultsArray à la console avant qu'elle ne soit remplie avec les valeurs de la demande AJAX. Le code suivant vous donnera une brève idée sur la façon d'utiliser les données de la réponse -

for (var i = 0; i <= splittedURLSLength; i++) {
        var extracted = extractUsername(splittedURLS[i]);
        postData = {'name' : extracted};
        ajaxRequest = $.when( $.ajax({
                          url: "/check",
                          type: "POST",
                          data: postData
                      })).then(function(returnedResponse) {
                          if (returnedResponse == "1") {
                              resultsArray.push(extracted);
                              showResults(resultsArray);
                          }   
                      });
}

function showResults(resultsArray) {
    console.log(resultsArray);
    //Process your resultsArray as per requirement.
}
1
Shekhar Chikara 7 mars 2016 à 15:59

Parce que les demandes AJAX sont asynchrones, votre console.log se déclenchera avant que la première demande AJAX ne revienne. C'est ainsi que la boucle d'événements fonctionne en Javascript.

Vous devez déplacer votre logique dans votre gestionnaire de réussite:

for (var i = 0; i <= splittedURLSLength; i++) {
        var extracted = extractUsername(splittedURLS[i]);
        postData = {'name' : extracted};
        ajaxRequest = $.when( $.ajax({
        url: "/check",
        type: "POST",
        data: postData
        })).then(function(returnedResponse) {
            if (returnedResponse == "1") {
                resultsArray.push(extracted);
            }
            if(i === splittedURLSLength){
               console.log(resultsArray);
            }
        });
1
Tate Thurston 7 mars 2016 à 16:34