1
votes

fonction de requête nodejs à l'intérieur de la boucle for

J'ai ces tableaux avec 8 éléments chacun

first index: 0
first console log pullRequest: 335
first console log Created by: A@A.com
first index: 1
first console log pullRequest: 328
first console log Created by: B@B.com
first index: 2
first console log pullRequest: 326
first console log Created by: C@C.com
first index: 3
first console log pullRequest ID: 323
first console log Created by: D@D.com
first index: 4
first console log pullRequest ID: 322
first console log Created by: E@E.com
first index: 5
first console log pullRequest ID: 314
first console log Created by: F@F.com
first index: 6
first console log pullRequest ID: 295
first console log Created by: G@G.com
first index: 7
first console log pullRequest ID: 291
first console log Created by: H@H.com
second index: 8
second console log pullRequest ID: 291
second console log Created by: H@H.com
second index: 8
second console log pullRequest ID: 291
second console log Created by: H@H.com
second index: 8
second console log pullRequest ID: 291
second console log Created by: H@H.com
second index: 8
second console log pullRequest ID: 291
second console log Created by: H@H.com
second index: 8
second console log pullRequest ID: 291
second console log Created by: H@H.com
second index: 8
second console log pullRequest ID: 291
second console log Created by: H@H.com
second index: 8
second console log pullRequest ID: 291
second console log Created by: H@H.com
second index: 8
second console log pullRequest ID: 291
second console log Created by: H@H.com

J'essaie de faire une demande de publication avec chaque index des tableaux:

XXX

Maintenant, voici la sortie de la console:

 function test2(){
   
    var array_pullrequest_id=["335","328","326","323","322","314","295","291"];
    var array_uniqueName=["A@A.com","B@B.com","C@C.com","D@D.com","E@E.com","F@F.com","G@G.com","H@H.com"];
    var count = 8;
     for (var i=0; i<count; i++){
     
    var pullRequests_id = array_pullrequest_id[i];    
    var createdBy = array_uniqueName[i];
  
  console.log("first index: " + i);
  console.log("first console log pullRequest ID: " + pullRequests_id);
  console.log("first console log Created by: " + createdBy);

  var options = {
  'method': 'GET',
  'url': 'https://HIDEN_URL/pullRequests/'+ pullRequests_id+'/workitems',
  'headers': {
    'Authorization': 'Basic HIDEN_AUTH',
    'Cookie': 'HIDEN_COOKIE'
  }
}
request(options, function (error, response) { 
    console.log("second index: " + i);
    console.log("second console log pullRequest ID: " + pullRequests_id);
    console.log("second console log Created by: " + createdBy);

});
}
 }

Comme vous pouvez le voir, les éléments du premier journal de la console sont imprimer correctement en suivant l'index de la variable count, mais à l'intérieur de la fonction de requête de la boucle for (deuxième journal de la console) , il n'imprime que le dernier élément du tableau, même si c'est à l'intérieur de la boucle, il prend juste le dernier n'a pas de sens pour moi ...


6 commentaires

request est une fonction asynchrone je crois, donc le premier journal de console et le deuxième journal de console ne sont pas exécutés dans l'ordre. la boucle se termine en premier, puis la fonction de requête obtiendra la dernière valeur de variable définie à la fin de la boucle, c'est pourquoi le deuxième journal de la console imprime 291 et H2H.com


@grandia Quelle autre façon de faire une requête http dans nodejs qui ne sont pas asynchrones me recommandez-vous?


Je recommanderais d'utiliser un autre cadre car la demande semble être obsolète. J'ai utilisé axios et fetch, et je pense que les deux sont excellents. Et pour le rendre synchrone, vous pouvez utiliser async / await. Connaissez-vous async / await?


Merci pour vos recommandations, je ne suis pas familiarisé avec async / await, mais je vais essayer de changer pour ces frameworks :)!


bien sûr, laissez-moi poster un code pour cela


Merci grandia!


4 Réponses :


0
votes

La raison pour laquelle le deuxième journal de la console imprime uniquement le dernier élément du tableau, car il se trouve dans la requête qui est une fonction asynchrone , qui signifie que lorsque la fonction request s'exécute en arrière-plan pour renvoyer une promesse, le reste de votre code en dehors de la fonction request s'exécute normalement et ainsi la boucle continue à itérer jusqu'au dernier élément du tableau


0 commentaires

0
votes

Faire une demande de service est de nature bloquante, nous devons donc utiliser soit des rappels, soit des promesses pour obtenir le résultat attendu. essayez d'utiliser asyncForEach avec cela, vous pouvez obtenir la sortie ci-dessus.

async function test2() {

    var array_pullrequest_id = ["335", "328", "326", "323", "322", "314", "295", "291"];
    var array_uniqueName = ["A@A.com", "B@B.com", "C@C.com", "D@D.com", "E@E.com", "F@F.com", "G@G.com", "H@H.com"];
    var count = 8;

    await asyncForEach(array_pullrequest_id, async(pullrequest, index) => {
        var pullRequests_id = array_pullrequest_id[index];
        var createdBy = array_uniqueName[index];

        console.log("first index: " + index);
        console.log("first console log pullRequest ID: " + pullRequests_id);
        console.log("first console log Created by: " + createdBy);

        var options = {
            'method': 'GET',
            'url': 'https://HIDEN_URL/pullRequests/' + pullRequests_id + '/workitems',
            'headers': {
                'Authorization': 'Basic HIDEN_AUTH',
                'Cookie': 'HIDEN_COOKIE'
            }
        }
        request(options, function(error, response) {
            console.log(error);
            console.log("second index: " + index);
            console.log("second console log pullRequest ID: " + pullRequests_id);
            console.log("second console log Created by: " + createdBy);

        });
    });
}

async function asyncForEach(array, callback) {
    for (let index = 0; index < array.length; index++) {
        await callback(array[index], index, array);
    }
}


0 commentaires

0
votes

Vous pouvez également utiliser async for loop "si votre version de nœud le prend en charge", comme indiqué ci-dessus, le problème avec votre code est que la requête est par nature asynchrone.


0 commentaires

1
votes

en supposant que vous avez installé axios, vous pouvez utiliser async / await comme ci-dessous

notez le mot-clé async devant la function test2 ()

maintenant test2 est une fonction asynchrone

const axios = require('axios');

async function test2(){
   
    var array_pullrequest_id=["335","328","326","323","322","314","295","291"];
    var array_uniqueName=["A@A.com","B@B.com","C@C.com","D@D.com","E@E.com","F@F.com","G@G.com","H@H.com"];
    var count = 8;
    for (var i=0; i<count; i++){

        var pullRequests_id = array_pullrequest_id[i];    
        var createdBy = array_uniqueName[i];

        console.log("first index: " + i);
        console.log("first console log pullRequest ID: " + pullRequests_id);
        console.log("first console log Created by: " + createdBy);

        var options = {
        'method': 'GET',
        'url': 'https://HIDEN_URL/pullRequests/'+ pullRequests_id+'/workitems',
        'headers': {
        'Authorization': 'Basic HIDEN_AUTH',
        'Cookie': 'HIDEN_COOKIE'
            }
        }
        await axios(options)
        .then(() => {
            console.log("second index: " + i);
            console.log("second console log pullRequest ID: " + pullRequests_id);
            console.log("second console log Created by: " + createdBy);
        })
        
    }
 }


0 commentaires