在我目前正在处理的应用程序中,我有2个HTML5画布,我正在使用。一个(TempCanvas)用于临时绘制图表,另一个(MainCanvas)用于将图表传输到其上以进行演示。我有一个图像,我试图绘制到TempCanvas上,然后当它被加载时,我想将TempCanvas绘制到MainCanvas上。
我遇到的问题是在将图像绘制到TempCanvas之前,TempCanvas被绘制到MainCanvas上。有没有办法等到图像加载后继续代码?
我的主要职能:
1 // Draw the chart onto the TempCanvas
2 $(this).DrawChart(TempCanvas, OtherParams);
3 // Draw the TempCanvas onto the MainCanvas
4 MainCanvasContext.drawImage(TempCanvas.get(0), PositionX, PositionY);
DrawChart功能:
1 $.fn.DrawChart = function(TempCanvas, OtherParams)
2 {
3 var image = new Image();
4 image.onload = function()
5 {
6 TempCanvasContext.drawImage(image, PositionX, PositionY);
7 // Draw some other stuff on the TempCanvas.
8 }
9 image.src = FilePath;
10 }
基本上我正在寻找一种等待DrawChart Line 6在主线4执行之前完成执行的方法。任何指向正确方向的人都会非常感激。
答案 0 :(得分:4)
在otherParams
对象中使用回调,如下所示:
// Draw the chart onto the TempCanvas
$(this).DrawChart(TempCanvas, { ...
callback : function(){
// THIS CODE WILL RUN ONLY AFTER IMAGE HAS LOADED
// Draw the TempCanvas onto the MainCanvas
MainCanvasContext.drawImage(TempCanvas.get(0), PositionX, PositionY);
}
});
DrawChart功能:
$.fn.DrawChart = function(TempCanvas, OtherParams)
{
var image = new Image();
image.onload = function()
{
TempCanvasContext.drawImage(image, PositionX, PositionY);
// Draw some other stuff on the TempCanvas.
otherParams.callback(); // NOW WE CAN CONTINUE RUNNING THE CODE
}
image.src = FilePath;
}
一般来说,在设计jQuery插件时创建回调函数和/或事件是一个好习惯。它们非常有用,整个库都是以这种方式构建的。
请注意,您可以这样做:
image.onload = otherParams.callback;
并将整个处理程序作为参数传递。这是您的决定,应该符合您的需求。在你的情况下,最好保持原样。
答案 1 :(得分:2)
由于图像加载是Async,您还必须以异步方式绘制MainCanvasContext。实现这一目标的一种方法是使用jQuery.Deffered
$.fn.DrawChart = function(TempCanvas, OtherParams)
{
var deferred = new $.Deferred();
var image = new Image();
image.onload = function()
{
TempCanvasContext.drawImage(image, PositionX, PositionY);
// Draw some other stuff on the TempCanvas.
deferred.resolve("I'm done");
}
image.src = FilePath;
return deferred.promise();
}
$(this).DrawChart(TempCanvas, OtherParams).done(function(){
MainCanvasContext.drawImage(TempCanvas.get(0), PositionX, PositionY);
});