async function imgResize(data){
// Convert base64 to buffer => <Buffer ff d8 ff db 00 43 00 ...
const buffer = Buffer.from(data, "base64");
Jimp.read(buffer, (err, res) => {
if (err) throw new Error(err);
console.log("Original image size: " res.getWidth() "x" res.getHeight())
if (res.getWidth() > 1025){
res.resize(1025, Jimp.AUTO)
console.log("resized image size: " res.getWidth() "x" res.getHeight())
}
res.getBase64(Jimp.AUTO, (err, value)=>{
if(err){return err)}
return value;
})
}
const img = await imgResize(base64data)
我明白了,SyntaxError: await 僅在異步函式和模塊的頂層主體中有效。但是,如果我洗掉異步并只列印值而不回傳它,它就可以正常作業。那么我如何能夠從該函式中獲取值作為回傳值并將其保存在變數中呢?
uj5u.com熱心網友回復:
您不能在異步回呼中回傳值并期望將它們分配給變數。異步回呼由 Node.js 稍后執行,此時執行背景關系丟失。例如,這不起作用:
function getImageWidth(buffer) {
Jimp.read(buffer, (err, res) => {
// Outside context is lost and returning here doesn't
// affect the return value of `getImageWidth` parent function
return res.getWidth(); // won't work ??
}
}
const width = getImageWidth(buffer);
console.log(width); // undefined
要完成您想要的,您有兩個選擇:
- 使用 Jimp 的承諾版本并繼續使用 async/await
- 將 imgResize 從 async/await 轉換為使用回呼
事實證明,如果您不傳遞回呼函式,Jimp 會回傳一個 Promise,因此選擇解決方案 #1 是最直接的。從回呼重構為 async/await將為我們提供以下資訊:
async function imgResize(data) {
const buffer = Buffer.from(data, "base64");
const res = await Jimp.read(buffer);
console.log(`Original image size: ${res.getWidth()} x ${res.getHeight()}`);
if (res.getWidth() > 1025){
res.resize(1025, Jimp.AUTO);
console.log(`Resized image size: ${res.getWidth()} x ${res.getHeight()}`);
}
return res.getBase64Async(Jimp.AUTO);
}
const img = await imgResize(base64data);
注意:為此,您需要使用 ES 模塊 (ESM) 啟用頂級等待。否則,您應該將最后一行包裝在 IIFE 中:
(async () => {
const img = await imgResize(base64data);
)();
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/442725.html
標籤:javascript 节点.js 异步 异步等待 吉普
上一篇:如何使用python-telegram-bot在dispatcher.run_async()中執行發送訊息任務?
下一篇:異步任務反應后如何呼叫函式
