Запуск функции x раз асинхронно в цикле for в узле - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть переключатель с делами в нем, в этом случае я хочу запустить axios.get() X количество раз, я пытаюсь сделать это с этим:

          case "visit":
        let i;
        for (i = 0; i < JSON.parse(cmd).contents.threads; i++) {
          let i;
          for (i = 0; i < JSON.parse(cmd).contents.visits; i++) {
            console.log(i + 1 + " visits run!");
            axios.get(JSON.parse(cmd).contents.target).then(res => {});
            if (i === JSON.parse(cmd).contents.visits - 1) {
              console.log("Visiting complete!");
            }
          }
        }
        break;

Дело в том, что этоне работает асинхронно и выдает результаты после этого, вывод выглядит следующим образом:

1 visits run!
2 visits run!
3 visits run!
4 visits run!
5 visits run!
6 visits run!
7 visits run!
8 visits run!
9 visits run!
10 visits run!
Visiting complete!
1 visits run!
2 visits run!
3 visits run!
4 visits run!
5 visits run!
6 visits run!
7 visits run!
8 visits run!
9 visits run!
10 visits run!
Visiting complete!

все сразу, так что это не асинхронный запуск, какие-либо предложения, как мне запустить этот асинхронный?Я пытаюсь изучить асинхронность в узле таким образом и надеюсь выполнить это.

Да, и прежде чем я забуду, вот объект js из cmd

 {
  id: "002",
  app: "visit",
  contents: {
    target: "https://google.com/",
    visits: 10,
    threads: 2
  }

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Это потому, что весь ваш вывод отправляется на консоль в рамках синхронного выполнения цикла.Вы запускаете асинхронный запрос в фоновом режиме, но не предоставляете обратный вызов, который делает что-либо после завершения запроса.Вы должны вывести на консоль в функции, которую вы передаете then().

Вот пример:

const contents = JSON.parse(cmd).contents;

for (let i = 0; i < contents.threads; i++) {
  let count = 0;

  for (let j = 0; j < contents.visits; j++) {
    axios.get(contents.target).then(result => {
      const number = ++count;

      console.log(number + " visits run!");
      if(number == contents.visits) console.log("Visiting complete!");
    });
  }
}
0 голосов
/ 30 сентября 2018

Не проверено

/////////
// option 1:
// To make this run sequentially
let p = Promise.resolve();
for (i = 0; i < JSON.parse(cmd).contents.visits; i++) {
  p = p.then(() => axios.get(JSON.parse(cmd).contents.target).then(res => { /* do whatever */});
}
p.then(() => {
    //all stuff done
})

//////
// option 2:
// To make this run in parallel (keeping your for loop, etc. (hint: using map would be more concise: 
const promises = [];
for (i = 0; i < JSON.parse(cmd).contents.visits; i++) {
  promises.push(axios.get(JSON.parse(cmd).contents.target).then(res => { /* do whatever */}));
}

Promise.all(promises).then(() => {
    //all stuff done
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...