nodejs функция запроса внутри цикла for - PullRequest
1 голос
/ 13 июля 2020

У меня есть эти массивы с 8 элементами каждый

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"];

Я пытаюсь выполнить почтовый запрос с каждым индексом массивов:

 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);

});
}
 }

Теперь это консольный вывод:

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

Теперь, как вы можете видеть, первый журнал консоли элементы печатаются правильно после индекса переменной count, но внутри for l oop функция запроса (второй журнал консоли) он печатает только последний элемент массива, даже если он находится внутри l oop, он просто берет последний, для меня это просто не имеет смысла ...

Ответы [ 4 ]

1 голос
/ 13 июля 2020

при условии, что вы установили ax ios, вы можете использовать async / await, как показано ниже

обратите внимание на ключевое слово async перед function test2()

теперь test2 асинхронная c функция

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 голосов
/ 13 июля 2020

Выполнение запроса на обслуживание является блокирующим по своей природе, поэтому мы должны использовать либо обратные вызовы, либо обещания, чтобы получить ожидаемый результат. попробуйте использовать asyncForEach, с этим вы можете добиться результата выше.

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 голосов
/ 13 июля 2020

Вы также можете использовать asyn c для l oop «если ваша версия узла поддерживает это», как сказано выше, проблема с вашим кодом заключается в том, что запрос является асинхронным по своей природе.

0 голосов
/ 13 июля 2020

Причина, по которой второй журнал консоли печатает только последний элемент в массиве, потому что он находится внутри request, который является функцией asynchronous, что означает, что функция request работает в фоновом режиме чтобы вернуть обещание, остальная часть вашего кода за пределами функции запроса выполняется как обычно, и поэтому l oop продолжает повторяться до последнего элемента в массиве

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...