gpt4 book ai didi

javascript - Node.js 异步/Promise 与 JIMP 的解释?

转载 作者:行者123 更新时间:2023-12-03 01:27:55 24 4
gpt4 key购买 nike

我正在开发一个 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
});
}

最佳答案

这是在同步循环中执行异步函数的典型示例。

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);
}

关于javascript - Node.js 异步/Promise 与 JIMP 的解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51437665/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com