2017-06-09 3 views
0

J'ai une fonction avec un callback qui vérifie si un fichier existe sur mon serveur, le résultat retourné étant "vrai" ou "faux". Mon problème est que j'appelle cette fonction "DoesFIleExist" dans une boucle for avec le "id" calculé plus tôt dans la fonction. Le problème est que chaque fois qu'un des appels de fonctions est résolu et essaie d'appeler "AddResultToPage", il utilise l'identifiant de la dernière itération de boucle forcée, alors qu'il devrait utiliser l'identifiant qui lui a été donné lors de l'appel de la fonction.Appel de fonction inline JavaScript à partir du rappel

La fonction "DoesFileExist" prend un chemin et un rappel en tant que paramètres.

Toute aide serait grandement appréciée, car j'ai regardé en ligne et sur ici mais la plupart des réponses que j'ai trouvées concernent des boutons et des écouteurs d'événement sur les boutons.

DoesFileExist('/XML/'+id.trim()+'.xml',function(data) { 
         console.log(id.trim()+" "+data); 
         if (data == "true") { 
          (function() { 
           console.log("adding to page - "+id.trim()); 
           AddResultToPage(id,false); 
          })(); 
         }else{ 
          console.log("the file does not exist"); 
         } 
+0

Vous avez besoin d'une fermeture, regardez vers le haut –

+0

Vous devez prendre id de l'espace global et le contrôle qu'il est portée avec var et passe en paramètre. Sinon, id peut être n'importe quoi. (quelqu'un d'autre pourrait le changer en un nombre et casser tout) – Tezra

Répondre

1

le mettre dans une fonction d'auto invocateur: -

(function(id){ 
DoesFileExist('/XML/'+id.trim()+'.xml',function(data) { 
        console.log(id.trim()+" "+data); 
        if (data == "true") { 
         (function() { 
          console.log("adding to page - "+id.trim()); 
          AddResultToPage(id,false); 
         })(); 
        }else{ 
         console.log("the file does not exist"); 
        } 
})}(id)) // now, your inner code has reference to correct id due to closure 

Qu'est-ce qui se passe est, au moment où votre réponse du serveur est reçu, le pour la boucle a été complétée et l'id est mis à la dernière valeur.

Avec fermeture, id se référera à la valeur passée dans la fonction et non celle de la boucle

+0

Merci, ceci a résolu mon problème. tyvm :) – user7856951

+0

bienvenue ..... :) –

-1

Vous pouvez utiliser un ID spécifique avec let (qui restera dans votre portée, c'est ES6). Il y a un lié poster SO sur les fermetures: How do JavaScript closures work?

DoesFileExist('/XML/'+id.trim()+'.xml',function(data) { 
         let specificId = id; 
         console.log(id.trim()+" "+data); 
         if (data == "true") { 
          (function() { 
           console.log("adding to page - "+specificId.trim()); 
           AddResultToPage(specificId,false); 
          })(); 
         }else{ 
          console.log("the file does not exist"); 
         }