2016-09-28 5 views
0

J'utilise node-rest-client pour faire un appel GET à un point de terminaison, et je voudrais faire cet appel plusieurs fois (en boucle), puis exposer un paramètre de la réponse.
Le code ressemble à:Noeud JS boucle et rappel

// registering remote methods 
client.registerMethod("reflect", "<the URL>", "GET"); 
// call the method 
var i = 10; 
while (i>0) { 
    client.methods.reflect(function (data, response) { 
     console.log("x-forwarded-for: " + data.headers["x-forwarded-for"]); 
     // raw response 
     //console.log(response); 
     }); 
    i--; 
} 

L'erreur que je reçois est:

TypeError: Cannot read property 'x-forwarded-for' of undefined 

Si i est égal à 2, alors c'est OK. Je suppose que le problème vient du fait qu'il s'agit d'une exécution asynchrone et que tous les appels dans le temps sont déclenchés à la fois, ce qui entraîne un colmatage quelque part le long des lignes.

Quelle est la meilleure façon d'avoir une exécution synchrone (en supposant que c'est là que réside le problème)?

+0

possible duplication de [async for loop dans node.js] (http://stackoverflow.com/questions/21184340/async-for-loop-in-node-js) – DrakaSAN

+0

Vous pouvez utiliser la bibliothèque de flux de contrôle comme 'async', ou utiliser récursivité pour le faire. Les promesses fonctionneraient aussi. – DrakaSAN

+0

Merci - oui, juste vu ce qui, je crois, résout le problème: https://github.com/caolan/async/blob/v1.5.2/README.md#wholesale – Christian68

Répondre

0

tout d'abord s'il vous plaît vérifier x-Forwarded-pour des mensonges en réponse et si le même problème persiste que vous attendez (appel asynchrone), puis simplement envelopper cet appel dans une fonction anonyme comme celui-ci

while(i > 0) { 
    (function abc(){ 
     client.methods.reflect(function (data, response) { 
      console.log("x-forwarded-for: " + data.headers["x-forwarded-for"]); 
      // raw response 
      //console.log(response); 
     }); 
    }()) 

    i--; 
} 
+0

Il n'y a pas de point dans l'emballage. Fonction de rappel interne La variable i n'est pas utilisée. –

+0

puis supprimez simplement cette variable i, peu importe –