目前for循环执行直到结束,即使它调用的函数还没有完成执行。我想这样做,当调用startloop函数直到它完全执行循环时,不应该向前移动..怎么做?我试过模拟goto,但它没有工作..
这是我的代码:
function startLoop(i) {
console.log("startloop function start");
var centerX = xObj[i];
var centerY = yObj[i];
var radius = 10;
var alpha = 1, /// current alpha value
delta = 0.01; /// delta = speed
var flag = 0;
var num = 0
function loop() {
console.log("inside loop " + centerX + " " + centerY);
alpha -= delta;
if (alpha <= 0) {
//console.log("heya_amigoes");
num = 2;
return;
}
//console.log("hi1");
/// clear canvas, set alpha and re-draw image
ctx2.clearRect(0, 0, 1000, 600);
ctx2.globalAlpha = alpha;
ctx2.beginPath();
ctx2.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);
ctx2.fillStyle = "#FF0000";
ctx2.fill();
ctx2.lineWidth = 1;
ctx2.strokeStyle = '#003300';
ctx2.stroke();
//console.log("hi2");
//requestAnimationFrame(loop); // or use setTimeout(loop, 16) in older browsers
setTimeout(loop, 16)
console.log("Outside function loop");
}
loop();
/*
LABEL1: do {
if(num==2)
{
num=0;
break LABEL1;
}
if(num!=2)
continue LABEL1;
}while(1);
*/
console.log("startloop function stop");
}
for (i = 0; i < xObj.length; i++) {
console.log("for loop running " + i);
startLoop(i);
console.log("outside loop func");
}
答案 0 :(得分:1)
for循环不会等待你的任务。要完成此任务,您必须使用recursion
。
<强>逻辑:强>
var count = 0
function test1(i, cb){
console.log("In Test " + i)
if(i < 10)
setTimeout(cb.bind(null, ++count, cb), 2000)
}
test1(count, test1)
<强>解释强>
我的方法模仿do..while
循环的行为。它有4个部分:
count = 0
{...}
中定义的代码。就我而言:test1(count, test1)
if(i<10)
。如果满足条件,则开始下一次迭代:setTimeout(cb.bind(null, ++count, cb), 2000)
++count
这是最后的JSFiddle
答案 1 :(得分:0)
我认为问题与你的for
循环有关。 startLoop
函数始终会获得xObj.length-1
。
您可以阅读有关此问题的更多信息:JavaScript closure inside loops – simple practical example
每个匿名函数中的变量
i
都绑定到 函数之外的相同变量。
ES6 let
功能解决方案:
for (let i = 0; i < xObj.length; i++) {
console.log("for loop running " + i);
startLoop(i);
console.log("outside loop func");
}
没有ES6的解决方案:
var funcs = [];
for (var i = 0; i < xObj.length; i++) {
funcs[i] = startLoop(i);
}
for (var i = 0; i < xObj.length; i++) {
console.log("for loop running " + i);
funcs[i]();
console.log("outside loop func");
}