Node.js: чтение картинки, которая перезаписывается, ссылается только на исходное изображение
Я в основном перезаписываю overwriteME.jpg внутри
const screenshotDesktop = require('screenshot-desktop')
const sharp = require('sharp');
(async () => {
while (1 < 5){
var currentShot = screenshotDesktop.all()
.then(imgs => {
return fs.writeFile(`/Users/ga/proj/overwriteME.jpg`, imgs[0], (err) => {
if (err) throw err;
crop();
});
});
await delay(1000);
}
async function crop(crop){
// original size from metadata
var resizedImage = await sharp('/Users/ga/proj/overwriteME.jpg');
var metadata = await resizedImage.metadata();
console.log(metadata);
};
})();
function delay(timeout) {
return new Promise((resolve) => {
setTimeout(resolve, timeout);
});
}
Я ожидал разных метаданных, так как я делаю скриншоты видео, воспроизводимого на экране и перезаписывающего overwriteME.jpg, и использую Sharp для извлечения метаданных.
Фактически произошло то, что возвращались те же метаданные, когда я думал, что Sharp будет отражать изменения файла.
Каким-то образом файл меняется, но, когда его читает диез, он ссылается на ту же старую картинку с самого начала.
2 ответа
Вы можете иметь состояние гонки, смешивая сырые Обещания без await
а также await
-ную. Попробуй заменить = screenshotDesktop.all()
с = await screenshotDesktop.all()
, Вы также можете оптимизировать код с помощью await
исключительно (не уверен что while (1 < 5)
значит, кстати)
'use strict';
const fs = require('fs').promises;
const screenshotDesktop = require('screenshot-desktop');
const sharp = require('sharp');
(async () => {
while (1 < 5) {
const imgs = await screenshotDesktop.all();
await fs.writeFile('/Users/ga/proj/overwriteME.jpg', imgs[0]);
await crop();
}
})();
async function crop() {
const resizedImage = await sharp('/Users/ga/proj/overwriteME.jpg');
const metadata = await resizedImage.metadata();
console.log(metadata);
}
Согласно комментариям от @titus, sharp.cache(false)
установить сразу после того, как оператор импорта работал для меня.