我现在已经尝试了两天将数组传递给setTimeout回调。
我一直在寻找互联网,我已经阅读了10个不同的StackOverflow问题及其所有答案。我必须遗漏一些东西,因为在尝试了所有这些不同的东西后,它仍然无效。这就是我现在所处的位置:
function testing(pixels){
return function(){
for(i=0; i<pixels.length;i++){
a = pixels[i][0];
b = pixels[i][1];
c = pixels[i][2];
d = pixels[i][3];
box = pixels[i][5];
done = pixels[i][6];
color_to_draw = done ? box.color:active_color;
ctx.fillRect(a,b,c,d);
ctx2.clearRect(box.x-1,box.y-1,box.w,box.h);
draw_colored_box(box.x, box.y, box.w, box.h, color_to_draw, box.alpha, true, ctx2);
}
};
}
function ias(pixel_batch){
var color_to_draw;
ctx.fillStyle = "#000000";
var a, b, c, d, e, box, done, i;
setTimeout(testing(pixel_batch),pixel_batch[0][4]);
}
我已经找到了所有不同的解决方案,我发现我的方法应该工作。我显然做错了,因为它不起作用。
问题在于,在函数ias()
中,pixel_batch.length
等于3,或者即使在函数testing()
,{{1是正确的值,但在函数RETURNED中通过测试,pixels.length`等于0 ......
最初,这是我尝试过的:
pixels.length
相信它不需要通过外部定义的函数来完成,但此时我已经开始尝试任何事情。
如何将pixel_batch(传递给function ias(pixel_batch){
var color_to_draw;
ctx.fillStyle = "#000000";
var a, b, c, d, e, box, done, i;
setTimeout((function(pixels){
console.log(pixels.length);
return function(){
for(i=0; i<pixels.length;i++){
a = pixels[i][0];
b = pixels[i][1];
c = pixels[i][2];
d = pixels[i][3];
box = pixels[i][5];
done = pixels[i][6];
color_to_draw = done ? box.color:active_color;
ctx.fillRect(a,b,c,d);
ctx2.clearRect(box.x-1,box.y-1,box.w,box.h);
draw_colored_box(box.x, box.y, box.w, box.h, color_to_draw, box.alpha, true, ctx2);
}
};
})(pixel_batch),pixel_batch[0][4]);
}
的参数)转换为setTimeout的回调?
[EDIT / UPDATE]
以下是实际调用ias()
的代码:
ias()
[2编辑/更新2]
我希望我能接受你所有的答案,因为你在技术上都是正确的。没有给你正确的信息,这是我的错。我投票给所有人,因为你们都应该得到答案,你们无法用所提供的信息把它给我。
答案 0 :(得分:2)
这是一篇很好的文章,解释了如何执行此操作:https://gullan.org.uk/passing-parameters-function-settimeout
以下是结论:setTimeout(function(){myFunction(parameter)}, myTimeout);
答案 1 :(得分:2)
你的问题就在这里:
ias(the_pixel_batch);
the_pixel_batch.length = 0;
您在setTimeout
运行之前清除阵列。
你应该这样做:
pixel_batch.length = 0;
...在setTimeout
回调中。
function ias(pixel_batch) {
ctx.fillStyle = "#000000";
setTimeout(function () {
var color_to_draw, a, b, c, d, e, box, done, i;
for (i = 0; i < pixels.length; i++) {
a = pixels[i][0];
b = pixels[i][1];
c = pixels[i][2];
d = pixels[i][3];
box = pixels[i][5];
done = pixels[i][6];
color_to_draw = done ? box.color : active_color;
ctx.fillRect(a, b, c, d);
ctx2.clearRect(box.x - 1, box.y - 1, box.w, box.h);
draw_colored_box(box.x, box.y, box.w, box.h, color_to_draw, box.alpha, true, ctx2);
}
pixel_batch.length = 0; // <<--- RIGHT HERE
}, pixel_batch[0][4]);
}
答案 2 :(得分:1)
扩展大卫的回答:我认为你可能想要的是这样的:
function draw () {
for(i=0; i<pixels.length;i++){
a = pixels[i][0];
b = pixels[i][1];
c = pixels[i][2];
d = pixels[i][3];
box = pixels[i][5];
done = pixels[i][6];
color_to_draw = done ? box.color:active_color;
ctx.fillRect(a,b,c,d);
ctx2.clearRect(box.x-1,box.y-1,box.w,box.h);
draw_colored_box(box.x, box.y, box.w, box.h, color_to_draw, box.alpha, true, ctx2);
}
}
function ias(pixel_batch){
var color_to_draw;
ctx.fillStyle = "#000000";
var a, b, c, d, e, box, done, i;
setTimeout(function () {draw(pixel_batch)},pixel_batch[0][4]);
}
不需要返回函数的函数,只需使用闭包来直接调用函数。
答案 3 :(得分:1)
是否在调用pixel_batch
之后修改ias()
数组,而在执行超时之前修改?如果是这样,您可以传递数组的副本:
setTimeout(testing(pixel_batch.slice(0)),pixel_batch[0][4]);
(注意.slice()只制作数组的一级深层副本...)