我正在尝试链接一些函数,但下面的函数给我带来了问题。
我使用的水印模块: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。
我是异步等待语法糖的新手,所以我可能在做一些明显错误的事情。
提前致谢!
答案 0 :(得分:2)
image-watermark
使用 node-ratify 检查您的回调是否为函数。当回调函数是异步函数时,它返回false,然后抛出错误。 Read more。
现在,有两个选择:
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);
}
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);
}
})();
});
}