Этот код
НЕ руководство к действию. В общем смысле, странно заставлять такую задачу работать синхронно. Но это прямой ответ на заданный вопрос.
Вот пример. Сделал небольшие изменения, чтобы избавиться от ошибок.
async function main()
{
let canvas = document.querySelector("#canvas");
canvas.width = 200;
canvas.height = 200;
let ctx = canvas.getContext('2d');
function fun(){
return new Promise((resolve, reject) => {
let dataUrl = "no";
let img = new Image()
img.onload = () => {
ctx.drawImage(img, 0, 0, img.width, img.height);
dataUrl = canvas.toDataURL();
resolve(dataUrl)
}
img.onerror = reject
img.src = "/img/fallback/logo-adunit.jpg";
})
}
let dataUrl = await fun();
document.querySelector("#print").innerText = dataUrl;
}
main()