异步函数在模块的回调中不起作用

时间:2021-03-16 13:10:57

标签: async-await

我正在尝试链接一些函数,但下面的函数给我带来了问题。

我使用的水印模块:https://www.npmjs.com/package/image-watermark

它工作的片段:

async function watermarkFile(filePaths){

    var waterMarkOptions = {
        'text' : 'blabla.com',
        'align' : 'ltr',
        'dstPath' : filePaths[1]
    }

    await watermark.embedWatermarkWithCb(filePaths[0], waterMarkOptions, function(err) {
        if(err){
            res.status(400).json({error: err});
        } else{
            resizeImage(filePaths); //I want this one to be await but I can't as the function callback isn't async
        }
    });
};

错误的片段:

async function watermarkFile(filePaths){

    var waterMarkOptions = {
        'text' : 'blabla.com',
        'align' : 'ltr',
        'dstPath' : filePaths[1]
    }

    await watermark.embedWatermarkWithCb(filePaths[0], waterMarkOptions, async function(err) {
        if(err){
            res.status(400).json({error: err});
        } else{
            await resizeImage(filePaths);
        }
    });
};

我得到的错误是:

(node:11261) UnhandledPromiseRejectionWarning: Error: Image-Watermark::embedWatermarkWithCb : Invalid arguments to method embedWatermarkWithCb

我想要做的就是用 await 调用 resizeImage

我是异步等待语法糖的新手,所以我可能在做一些明显错误的事情。

提前致谢!

1 个答案:

答案 0 :(得分:2)

image-watermark 使用 node-ratify 检查您的回调是否为函数。当回调函数是异步函数时,它返回false,然后抛出错误。 Read more

现在,有两个选择:

  1. embedWatermarkWithCb 转换为 Promise 函数并在完成后调用 resizeImage(推荐)。
async function watermarkFile(filePaths) {
  var waterMarkOptions = {
    'text': 'blabla.com',
    'align': 'ltr',
    'dstPath': filePaths[1]
  }

  await new Promise((resolve, reject) => {
    watermark.embedWatermarkWithCb(filePaths[0], waterMarkOptions, function (err) {
      if (err) {
        return reject(err);

      }
      resolve()
    });
  }).catch((err) => {
    res.status(400).json({ error: err });
  })
  await resizeImage(filePaths);
}
  1. 使用立即函数
function watermarkFile(filePaths) {
  var waterMarkOptions = {
    'text': 'blabla.com',
    'align': 'ltr',
    'dstPath': filePaths[1]
  };

  watermark.embedWatermarkWithCb(filePaths[0], waterMarkOptions, function (err) {
    (async () => {
      if (err) {
        res.status(400).json({ error: err });
      } else {
        await resizeImage(filePaths);
      }
    })();
  });
}