我有这段代码,应该每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
)
}
您的setTimeout
功能已用5000
硬编码。这意味着您的循环从0到99运行并设置100个超时,每个超时的等待时间为5000。由于循环执行得非常快,因此产生的超时也非常接近地执行。
您需要类似的东西:
setTimeout(function() {
...
},
5000 * i
)
这将使超时从0 * 5000扩展到99 * 5000毫秒。
同步代码的执行方式是,所有代码都必须先完成运行,然后才能将任何内容更新或“呈现”到屏幕上。因此,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
}
我将使用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);
我也遇到了同样的问题,并且我使用了.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));
}