【发布时间】:2019-03-28 03:50:05
【问题描述】:
我正在尝试使用 for 循环内的图像加载器绘制图像。它仅在最后一次迭代中绘制所有图像。
在控制台中它不显示draw -> 0 或draw -> 1 它只显示draw -> 2
感谢您的帮助!!
这是我的代码块:
// For every player run iteration
var pos="";
var iter="";
for (var i = 0; i < item.length; ++i) {
// Position for players on account screen
if(i == 0){ pos = "61px"; iter = 0; console.log("pos 0 -> " + iter);}
if(i == 1){ pos = "168px"; iter = 1; console.log("pos 1 -> " + iter);}
if(i == 2){ pos = "275px"; iter = 2; console.log("pos 2 -> " + iter);}
console.log(i);
console.log("pos -> " + pos);
console.log("iter -> " + iter);
// Gets player name from string
let player = item[i].match( /([A-Z])\w+/g );
// Create player div for mouse interaction
let player_el = $('<div class="cursor player" id="player'+ player +'"></div>');
$("#can_wrapper").append(player_el);
$("#player"+ player).css({"position": "absolute", "height": "50px", "width": "50px", "left": ""+ pos +"", "top": "271px", "cursor": "grab", "cursor": "-webkit-grab"});
// Get player name for hover action
let player_name_el = player;
document.styleSheets[0].addRule('#player'+ player +':hover::after','content: "'+player_name_el+'";');
/**
* Promisify loading an image
* @param {String} imagePath The web location of the image
* @returns {Promise} A Promise that will resolve to an Image
*/
function loadImage(imagePath) {
return new Promise((resolve, reject) => {
let image = new Image();
image.addEventListener("load", () => {
resolve(image);
});
image.addEventListener("error", (err) => {
reject(err);
});
image.src = '../interface/images/body/' + imagePath;
});
}
let imageSources = ['v1456.png', 'vbody0.png','vhead14.png','v1960.png','v578.png','v1221.png', 'v3063.png']; // url and order
Promise
.all(imageSources.map(ii => loadImage(ii)))
.then((images) => {
images.forEach((image) => {
if (iter == 0) { ctx.drawImage(image, 60, 270); console.log("draw -> 0");}
if (iter == 1) { ctx.drawImage(image, 167, 270); console.log("draw -> 1");}
if (iter == 2) { ctx.drawImage(image, 274, 270); console.log("draw -> 2");}
console.log(iter);
});
}).catch((err) => {
console.error(err);
});
}
【问题讨论】:
-
当
imageSources.map(ii => loadImage(ii))承诺解决时,即在调用.then 回调之前,for (var i = 0; i < item.length; ++i)循环将完成,iter将是 2 ... 大提示你做错了是pos 2 -> 2在任何draw被注销之前被记录——你需要重新考虑你的代码——我什至无法想象你想要以什么顺序实现目标跨度> -
我正在尝试为每次迭代绘制数组中的角色图稿。 i.imgur.com/yAOghrQ.png 红色方块是 3 次迭代,最后一次迭代是正在绘制的内容。图像必须在图像加载器中,因为它们需要以特定方式加载,以便正确堆叠
-
现在只使用相同的图像作为占位符。在我让它们正确显示后,我将从数据库中动态提取它。老实说,我真的不知道承诺是如何运作的
-
谢谢我看看我能从你的例子中找出什么
-
你需要记住的是...... Promise .then 被异步调用 - 所以你需要考虑到这一点
标签: javascript jquery html canvas