###前提・実現したいこと
Canvasを用いて画像の合成処理を行っています。
頻繁に行う処理であるため以下のように関数化しました。
###該当のソースコード
javascript
1//配列内に格納された画像を順に合成していく関数 2function synthesize_img(arr, color, shade, canvas_id) { 3 width = 580; 4 height = 1620; 5 6 var canvas = document.getElementById(canvas_id); 7 var context = canvas.getContext("2d"); 8 context.clearRect(0, 0, width, height); 9 var images = []; 10 //配列内に画像パスを格納していく 11 for(var i in arr){ 12 images[i] = new Image; 13 images[i].src = arr[i]; 14 } 15 //最後尾に画像を格納 16 var last = images.length; 17 images[last] = new Image; 18 images[last].src = color; 19 //更に最後尾に画像を格納 20 var last2 = images.length; 21 images[last2] = new Image; 22 images[last2].src = shade; 23 24 //配列内のすべての画像の読み込みが終わった時点で、画像の合成と描画を行う 25 var loadedCount = 1; 26 for(var i in images){ 27 images[i].addEventListener("load", function(){ 28 if(loadedCount == images.length){ 29 //配列の最後尾の前までを合成 30 for(var j=0; j<images.length-1; j++){ 31 context.globalCompositeOperation = "source-over"; 32 context.globalAlpha = 1.0; 33 context.drawImage(images[j], 0, 0, width, height); 34 } 35 //配列の最後尾を乗算 36 context.globalCompositeOperation = "multiply"; //IEでは対応していない 37 context.drawImage(images[images.length-1], 0, 0, width, height); 38 //必要に応じて合成 39 if(arr != SRC_ARR.back && arr != SRC_ARR.right && arr != SRC_ARR.left){ 40 var img_add = new Image; 41 img_add.src = btn_front; 42 img_add.addEventListener("load", function(){ 43 context.globalCompositeOperation = "source-over"; 44 context.globalAlpha = 1.0; 45 context.drawImage(img_add, 0, 0, width, height); 46 //処理終了確認 47 console.log("Draw Finish!"); 48 }); 49 } 50 } 51 loadedCount++; 52 }, false); 53 } 54 //処理終了確認 55 console.log("All Finish!"); 56}
JavaScriptはシングルスレッドで処理されていくため、上記のような非同期処理を含まない場合、上から順に処理が行われていくのが普通だと思います。
しかし、実行しChromeのコンソールを見てみると、「All Finish!」が先に表示され、「Draw Finish!」が後に表示されます。
この原因は一体何なのでしょうか?また、これを解決するにはどうすればよいのでしょうか?(やはり、deferredを使用することでしょうか?)

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/26 06:46
2016/07/28 09:12