上下文

  • 我们有一个基于Ember的应用程序,可以处理大量结构化数据(业务流程模型)。
  • 重要!我们真的很希望我们的应用程序尽可能保持离线状态。

  • 需要

    虽然我们只需要显示这些数据,对其进行编辑等等,但雷达中没有显示停止器...

    但是现在,我们希望对这些模型进行处理:有效性检查,路径查找...以及几种类型的时间/内存消耗算法。

    问题

    我们可以在服务器上处理算法,但是这会终止应用程序的脱机模式。

    我们曾考虑过让Web Worker避免在后台冻结应用程序和流程算法,但我们面临一个主要问题:将数据传递给Worker时数据重复。
    使用可转移对象将使应用程序至少在计算期间失去所有权(和数据),因此它似乎不可行。

    您将如何处理这个问题?我们唯一的出路是使用算法的“类似协程”的实现吗?有什么线索吗?

    最佳答案

    如果您主要关注的是在开发的冗长的javascript处理过程中不冻结UI,则可以将循环体重构为顺序的步骤,以便每个步骤都可以使用window.setTimeout调用其下一个步骤。此技术允许(单个)线程处理每次交互之间的UI事件:

    var pr = function(x) {console.log(x)};
    var COUNT=3;
    
    // original regular javascript loop
    for(var i=0; i<COUNT; i++) {
      var msg = "current index is (" + i + ")";
      pr(msg);
    }
    
    // step-by-step sequential calls
    var body = function(i) {
      var msg = "non-blocking for: index is (" + i + ")";
      pr(msg);
    }
    nonBlockingFor(body, 4);
    

    函数nonBlockingFor调用第一个参数(作为一个函数)作为第二个参数传递的次数。它的定义如下:
    // function constructor
    var nonBlockingFor = (function() {
      function _run(context) {
        if(context.idx > context.max) return;
        context.fnc(context.idx++);
        window.setTimeout((function(){ _run(context)}), 1);
      }
      return (function _start(ufn, uqt, runId) {
        _run({idx: 0, max: uqt -1, fnc: ufn || (function(){}), runId: runId});
      });
    })();
    

    请注意,这是一个非常简化的功能,可以进行改进以处理其他与多线程相关的问题-即:WAITING线程完成(加入)。希望这段代码对您有所帮助。如果您喜欢这种解决方法的方法,请告诉我,如果您愿意,我可以花一些时间改善我的建议。

    关于javascript - 如何处理浏览器中显示数据的重负荷处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11248157/

    10-12 00:16
    查看更多