在JavaScript中存储执行状态?你能晚点回来吗?

时间:2012-10-03 03:07:20

标签: javascript html5 execution checkpoint

有没有这样做?我想创建一个JavaScript应用程序,可以从最后一个检查点“恢复”应用程序,例如

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

检查点功能将存储有关执行的每个信息,以便将来执行可以在原来的位置恢复:

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

这对于执行带有大循环的长脚本/脚本非常有帮助 - 我不是在谈论执行一些预先加载图像或做一些有趣动画的小脚本。我在谈论使用JavaScript作为一个真实的数字运算工具,执行可能需要很长时间,并需要巨大的计算能力。在这些上下文中,您可以看到执行检查点的有用性!

我认为JavaScript还没有这样的东西,但如果有人接近远程类似的东西我仍然会非常感激。

3 个答案:

答案 0 :(得分:1)

最新的浏览器支持yield。我们可以调查一下。

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

答案 1 :(得分: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>

答案 2 :(得分:0)

Javascript不是为实时数字运算工具设计的,因为执行可能需要很长时间并且需要巨大的计算能力#34;这是您获得的最好成绩:http://www.w3schools.com/html/html5_webstorage.asp