承诺在任务完成之前解决火灾

Promise resolve fires before task is complete

我正在使用 promise 函数和 Jimp 调整图像大小,将其保存在文件夹中,然后 return 新调整大小图像的路径。

但是,resizeWidth() 中的 resolve() 函数在 image.resize().write() 完成之前触发,这意味着我的应用程序崩溃,因为它找不到新文件。

如有任何帮助,我们将不胜感激。

const fs = require('fs');
const path = require('path');
const jimp = require('jimp');

const resizeWidth = function(file, width) {
  return new Promise((resolve, reject) => {
    jimp.read(path.join(__dirname, '..', 'assets', 'images', file), (err, image) => {
      if (err) reject(err);
      const xSize = parseInt(width);
      image.resize(xSize, jimp.AUTO)
        .write(path.join(__dirname, '..', 'assets', 'images', 'tmp', file));
      resolve(path.join(__dirname, '..', 'assets', 'images', 'tmp', file));
    });
  });
};

module.exports = function(server) {
  server.get('/images/:name/:width', (req, res) => {
    resizeWidth(req.params.name, req.params.width)
      .then(() => {
        fs.readFile(path.join(__dirname, '..', 'assets', 'images', 'tmp', req.params.name),
          (err, newData) => {
            if (err) throw err;
            res.sendRaw(200, newData, {
              'Content-Length': Buffer.byteLength(newData)
            });
            res.end();
          });
      })
      .catch((err) => {
        console.log(err);
      });
  });
};

write 是异步函数,因此在 write 函数完成之前调用 resolve。使用回调确保顺序

jimp.read(path.join(__dirname, '..', 'assets', 'images', file), (err, image) => {
  if (err) reject(err);
  const xSize = parseInt(width);
  image.resize(xSize, jimp.AUTO)
    .write(path.join(__dirname, '..', 'assets', 'images', 'tmp', file), () => {
       resolve(path.join(__dirname, '..', 'assets', 'images', 'tmp', file));
    });
});