承诺在任务完成之前解决火灾
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));
});
});
我正在使用 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));
});
});