无法在此节点http get请求中添加超时

问题描述 投票:2回答:4

我有这段代码,应该每5秒调用一次函数download,但由于所有图像都是同时下载的,因此似乎不起作用。

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
  )
}
javascript node.js settimeout
4个回答
2
投票

您的setTimeout功能已用5000硬编码。这意味着您的循环从0到99运行并设置100个超时,每个超时的等待时间为5000。由于循环执行得非常快,因此产生的超时也非常接近地执行。

您需要类似的东西:

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

这将使超时从0 * 5000扩展到99 * 5000毫秒。


2
投票

同步代码的执行方式是,所有代码都必须先完成运行,然后才能将任何内容更新或“呈现”到屏幕上。因此,for循环将一直运行到完成为止,然后屏幕将更新,但当然只有要渲染的已执行代码的最终视图。

要在for循环的每个迭代中解决此问题,您应该触发一个异步函数,该函数将在以后的某个时间更新,而不是在当前的同步for循环代码之外。

例如:

    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
投票

我将使用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);


0
投票

我也遇到了同样的问题,并且我使用了.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));
}
© www.soinside.com 2019 - 2024. All rights reserved.