I've been learning about html5's canvas. Because images can take a while to load, it seems the appropriate technique is to use onload
to wait for the image to load before attempting to draw it. So:
<canvas id="fig" width="400" height="400"></canvas>
var fig = document.getElementById('fig1');
var ctx = fig.getContext('2d');
var img = new Image();
img.onload = function() { ctx.drawImage(img, 300, 100); };
img.src = 'data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw==';
However, it is likely that code following this gets executed before the onload function can do the drawImage()
, possibly causing undesired behavior:
ctx.translate(0,400); ctx.scale(1,-1); /* switch to lower-left as origin */
/* if onload happens after here, it uses new coordinate system! */
ctx.beginPath();
ctx.moveTo(10, 20);
ctx.lineTo(290, 30);
ctx.stroke();
Surely there is some sensible way of dealing with this (and doing everything in the onload function seems non-sensible).
========================== EDIT BELOW ========================
Here is a change to my code using a single promise to illustrate the idea as simply as I can.
var img = new Image();
var promise = new Promise( // make a promise
function(resolve, reject) {
img.onload = function() {
ctx.drawImage(img, 300, 100);
resolve(); // keep the promise -- lets the "then" proceed
};
img.src = 'data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw==';
}
);
// .then() waits for the promise to be resolved (see also .catch for rejection)
promise.then( function() {
ctx.translate(0,400); ctx.scale(1,-1);
ctx.beginPath();
ctx.moveTo(10, 20);
ctx.lineTo(290, 30);
ctx.stroke();
});
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…