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 ...
4 Réponses :
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
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); } }
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.
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); }) } }
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!