0

我基本上是在里面覆盖 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 会反映文件更改。

不知何故,文件正在发生变化,但是当夏普读取它时,它从一开始就引用了同一张旧图片。

4

2 回答 2

1

你可能有一个竞争条件混合原始 Promises 没有awaitawait-ing。尝试替换= 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);
}
于 2019-02-11T03:01:44.760 回答
0

根据@titus 的评论,sharp.cache(false)在 import 语句对我有用之后立即设置。

于 2019-02-11T17:39:08.290 回答