2012-10-03 38 views
0

反正有做到这一点?我想创建一个JavaScript应用程序,可以从上一个检查点“恢复”应用程序,例如在JavaScript中存储执行状态?你能稍后恢复吗?

//code.js 
var abc = 13; 
checkpoint("myLocalStorage"); 
alert(abc); 

检查点功能将存储有关执行每一个信息,以便在将来执行,可以正确恢复它留下的是这样的:

//resume.js 
resume("myLocalStorage"); 

这将是执行长非常有帮助脚本/脚本巨大的循环 - 我不是在谈论执行用于预先加载图像或做一些有趣的动画,一些微小的脚本。我说的是使用JavaScript作为一个实数运算工具,在那里执行可能需要较长的时间和巨大需求的计算能力。在这种情况下,您可以看到执行检查点有多有用!

我想这种东西在JavaScript中还不存在,但如果有人接近某种远程类似的东西,我仍然会非常感激。

+1

出于好奇,你知道的*有这样的功能,任何*语言? –

+0

@GGG:C具有的setjmp()和longjmp()。另请参阅C#5异步或协程。 – SLaks

+0

@SLaks由于某种原因,我认为程序状态应该被保存,这应该在跨会话中工作......也许我读错了问题。 –

回答

1

为了使一些在Javascript中说:“挂起能”,你需要比你会在正常的程序,制定了不同意见。

步骤1
决定你是多少的问题能够在一个做的,由于缺乏一个更好的词。

第2步
将状态存储在某种对象中。你有没有中间值,需要的只是到底是什么使下

步骤3
编写代码,以便它可以用一个window.setTimeout()功能运行。这使得测试比重新加载页面更容易。

在这种情况下,我有我的全名转换为小写的程序,一步一个脚印的时间。我需要保存的唯一数据是我的名字,以及我在计算中的位置的索引。

实施例1:使用setTimeout()

<html> 
    <head> 
    <title>Test Thingy</title> 
    </head> 
    <body> 
    <script> 
    var data = { 
     name: ["Jeremy", "J", "Starcher"], 
     idx: 0 
    } 

    function doPass() { 
     // If at the end of the list 
     if (data.idx >= data.name.length) { 
     alert("All iterations done:" + data.name.join(" ")); 
     return; 
     } 

     // Do our calculation here 
     var s = data.name[data.idx]; 
     s = s.toLowerCase(); 
     data.name[data.idx] = s; 
     data.idx++; 
     window.setTimeout(doPass); 
    } 
    doPass(); 
    </script> 

    </body> 
</html> 

实施例2:使用localStorage的。点击“刷新” 4次测试

<html> 
    <head> 
    <title>Test Thingy</title> 
    </head> 
    <body> 
    <script>  
    var data; 
    data = localStorage.getItem("data");  
    if (data) { 
     data = JSON.parse(data); 
    } else { 
     data = { 
     name: ["Jeremy", "J", "Starcher"], 
     idx: 0 
     } 
    } 

    function doPass() { 
     // If at the end of the list 
     if (data.idx >= data.name.length) { 
     alert("All iterations done:" + data.name.join(" ")); 
     return; 
     } 

     // Do our calculation here 
     var s = data.name[data.idx]; 
     alert(s); 
     s = s.toLowerCase(); 
     data.name[data.idx] = s; 
     data.idx++; 
     localStorage.setItem("data", JSON.stringify(data)); 
    } 

    doPass(); 
    </script> 

    </body> 
</html> 
+0

谢谢。我想到了你的第二种方法,这绝对是一种很好的方法,但我认为平台的用户对我们有点透明。如果你考虑调用其他有副作用的函数的可能性,我认为可能很难跟踪所有的执行状态 – lolski

+0

@GaneshwaraHerawanHanandaPut - 哦,我明白到底有多难跟踪执行状态,这就是为什么知道在哪里分解事情是至关重要的。任何迭代问题都需要在每次重新加载时处理一次* pass *或* iteration *,而不是试图只进行迭代的一部分。我无法想象你会得到一个更简单的解决方案。 –

+0

是的,看起来这些毕竟是最好的解决方案。谢谢。问候,Ganesh – lolski

1

最新的浏览器支持yield。我们可以研究它。

https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7

+1

你能告诉我这可以帮助吗?我知道我从Scala的一些经验中获益,这个特性对于生成一个集合的元素非常有用。但我没有看到这可以如何帮助解决我的问题。问候,Ganesh – lolski

+0

@ GaneshwaraHerawanHanandaPut斯卡拉'yield'是完全不同的东西。在这个答案中,'yield'意味着一个执行线程暂时放弃执行,所以可以运行不同的事情。这种自愿屈服与先发制人的多任务形成对比。 – ziggystar

相关问题