我正在使用一个Discord机器人,该机器人会获取上载的图片附件,在编辑后将其保存到临时文件中,然后将其上传到Discord服务器。一切正常,除了时间安排。 sendImage
函数在generateImagePixel
函数之后被调用,但是在jimp.write
完成之前尝试上载临时图像,从而导致ENOENT错误。我该如何解决计时问题?
client.on('message', message => {
if (message.content.includes(config.prefix + 'pixel')) {
var tempname = d.getTime();
console.log(tempname);
generateImagePixel(message.attachments, tempname).then(() => sendImage(tempname, message))
}
});
function generateImagePixel(msg, name) {
return new Promise((resolve, reject) => {
msg.forEach(a => {
try {
jimp.read(a.url, function (err, image) {
const clone = image.clone();
clone.pixelate(8)
.rgba(true)
.filterType(0)
.write('./temp/' + name + '.png');
});
} catch(err) {
console.log(err);
}
});
resolve(name)
})
}
function sendImage(tempname, msg) {
msg.channel.send({
file: './temp/'+ tempname + '.png' // Or replace with FileOptions object
});
}
答案 0 :(得分:1)
这是在同步循环中执行异步功能的典型示例。
jimp.read
是异步的,因此每个调用在完成实际调用之前都会立即返回。因此,msg.forEach
也在jimp
完成之前完成。
一旦您使用异步的东西,您要做的一切都必须是异步样式:
function generateImagePixel(msg, name) {
const promises = msg.map(attachment => {
return jimp.read(attachment.url)
.then(image => {
return image
.pixelate(8)
.rgba(true)
.filterType(0)
.write('./temp/' + name + '.png');
})
.catch(console.error);
});
return Promise.all(promises)
.then(() => name);
}