js setTimeout recursion return-continue
js setTimeout recursion return-continue
我将使用这个用C编写的简单迷宫求解器程序,例如我在javascript中需要的东西:
int is_free_place(int x,int y) {
char ch[2];
if(x<1||x>80||y<1||y>20)
return 0;
gettext(x,y,x,y,ch);
return ch[0]==32; // X or space
}
int solve(int x, int y, int x_end,int y_end) {
int ans=0;
if(kbhit()) efn();
gotoxy(x,y);
putchar('.');
delay(DELAY_TIME);
if(x==x_end&&y==y_end)
return 1;
if(is_free_place(x-1,y))
ans=solve(x-1,y,x_end,y_end); //// <<<<< recursion starts here
if(ans==0&&is_free_place(x+1,y)) //// can't continue to here if using setTimeout
ans=solve(x+1,y,x_end,y_end); //// because ans is not set
if(ans==0&&is_free_place(x,y-1))
ans=solve(x,y-1,x_end,y_end);
if(ans==0&&is_free_place(x,y+1))
ans=solve(x,y+1,x_end,y_end);
if(ans==0){
gotoxy(x,y);
putchar(' ');
delay(DELAY_TIME);
}
return ans;
}
void main(){
clrscr();
efn(); // reads maze from file, shows menu, calls solve()
}
我正在尝试在 javascript 中进行类似的递归,但浏览器冻结直到代码完成,我需要的是进度的慢速动画,并提供暂停和更改内容的选项。所以我尝试使用 setTimeout,但我无法弄清楚函数何时"返回"并且代码从递归调用继续的算法......(setTimeout 立即继续,不等待函数返回(
[更新]有没有办法使用产量而不是堆栈来做到这一点?
把它
写成可以与setTimeout一起使用的东西会有点不平凡,特别是因为,正如所写的那样,你需要得到递归调用的结果。 我认为处理这样的事情的最简单方法是必须像 dojo 和 jQuery 一样使用某种承诺基础设施(或自己编写(。 我会更详细地介绍,但目前我无法进一步研究。 一个提示:我认为jQuery的pipe
方法会在这里创造奇迹。
想到的其他选项是重写它以使用堆栈,这将保存 ans 变量,并且可能表示您需要返回当前函数调用的哪一部分。
setTimeout
只运行一次。 它的返回值是超时本身。
var timeout = setTimeout(function () { console.log( "hi" ) }, 1000);
// timeout == some id
这允许您清除超时(如果您选择使用 clearTimeout
方法执行此操作(
您可以使用递归setTimeout
循环创建游戏循环。
setTimeout(function call() {
// Do code
//...
setTimeout( call, 1000 / 60 ); // loop
}, 1000 / 60 ) // 60 fps
这是一个 javascript 示例,如何使用 setTimeout
以及如何使用 clearTimeout
清除它。
<html>
<head>
<script type="text/javascript">
var c=0;
var t;
var timer_is_on=0;
function timedCount()
{
document.getElementById('txt').value=c;
c=c+1;
t=setTimeout("timedCount()",1000);
}
function doTimer()
{
if (!timer_is_on)
{
timer_is_on=1;
timedCount();
}
}
function stopCount()
{
clearTimeout(t);
timer_is_on=0;
}
</script>
</head>
<body>
<form>
<input type="button" value="Start count!" onclick="doTimer()" />
<input type="text" id="txt" />
<input type="button" value="Stop count!" onclick="stopCount()" />
</form>
</body>
</html>
它取自这里。
我认为setInterval可以完成这项工作:setInterval
var int = setInterval(clock,1000);
function clock()
{
var d=new Date();
var t=d.toLocaleTimeString();
document.getElementById("clock").value=t;
}
相关文章:
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- C++函数中的精确"return"矩
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- 方法错误"not all control paths return a value"和方法不返回值
- GLFW glfwCreateWindowSurface return -7
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- 如何解决类成员函数中的"return a value"错误?
- C++概念assignable_from不接受 const&-return 运算符=
- Malloc void return char 数组有时不起作用(Terry Davis 对 C++);
- 返回引用实例和非引用实例(return mystr & vs mystr)之间的区别是什么?
- 错误:调用 .. at return 语句时没有匹配函数
- 当你只使用 return 时,函数返回什么类型;在 c++ 中
- GLSL C++ glVertexAttribPointer & glDrawElements return GL_INVALID_OPERATION
- return ((fileatr & FILE_ATTRIBUTE_DIRECTORY) == 0);
- "Warning : No return statement in function returning non-void"是什么意思?
- 为什么 for 循环和 while 循环之间的 continue 不同?
- 当出现错误ld return 1退出状态时,如何编译程序
- 使用flag、return、exception、goto或break中止过程
- js setTimeout recursion return-continue
- Ghostscript API 请求"press <return> to continue"