簡體   English   中英

JIMP的Node.js異步/承諾說明?

[英]Node.js Async/Promise explanation with JIMP?

我正在使用一個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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM