Невозможно добавить тайм-аут в HTTP-запросе этого узла - PullRequest
2 голосов
/ 27 мая 2020

У меня есть этот код, в котором функция download должна вызываться каждые 5 секунд, но, похоже, она не работает, поскольку все изображения загружаются одновременно.

const download = function (uri, filename, callback) {
  request.head(uri, function (err, res, body) {
    request(uri).pipe(fs.createWriteStream(filename)).on('close', callback); 
   });
};

for (let i = 0; i < 100; i++) {
  setTimeout(function () {
    download(
      'https://www.thispersondoesnotexist.com/image', 
      `images/image${i}.jpg`,
      function () {
        console.log('done');
      });
    },
    5000
  )
}

Ответы [ 4 ]

3 голосов
/ 27 мая 2020

Ваша функция setTimeout жестко запрограммирована на 5000. Это означает, что ваш l oop работает от 0 до 99 и устанавливает 100 тайм-аутов, каждый с временем ожидания 5000. Поскольку l oop выполняется очень быстро, созданные таймауты также выполняются очень близко друг к другу.

Вам нужно что-то вроде:

 setTimeout(function() {
   ...
   },
   5000 * i
 )

Это расширит таймауты от 0 * 5000 до 99 * 5000 миллисекунд.

2 голосов
/ 27 мая 2020

Синхронный код выполняется так, что весь ваш код должен быть sh завершен, прежде чем что-либо может быть обновлено или "отображено" на экране. Таким образом, for l oop будет работать до тех пор, пока это не будет выполнено, затем экран обновится, но, конечно же, он будет иметь только окончательный вид выполненного кода для рендеринга.

Чтобы исправить это внутри каждой итерации для l oop вы должны запустить асинхронную функцию, которая будет обновляться позже и позже, за пределами текущего синхронного для кода l oop.

например:

    const download = function () {
        return "ready player "
    };

 for (let i = 1; i <= 10; i++) {//the code will only iterate 10 times
    setTimeout(function () {
         console.log(download()+i);
     }, 500 * i);  //reduced the timer here to 500
 }
0 голосов
/ 27 мая 2020

У меня была такая же проблема, и я использовал .then(), чтобы исправить ее.

const download = require("image-downloader");

function downloadIMG(opts) {
  const { filename, image } = download
    .image(opts)
    .then(({ filename }) => {
      console.log("Saved to", filename); // saved to /path/to/dest/photo
    })
    .catch((err) => console.error(err));
}
0 голосов
/ 27 мая 2020

Я бы использовал setInterval, чтобы повторить ваш метод:

const download = function (uri, filename, callback) {
  request.head(uri, function (err, res, body) {
    request(uri).pipe(fs.createWriteStream(filename)).on('close', callback); 
   });
};

setInterval(() => {
    for (let i = 0; i < 100; i++) {
        download(
          'https://www.thispersondoesnotexist.com/image', 
          `images/image${i}.jpg`,
          function () {
            console.log('done');
        });
    }
}, 5000);

...