Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 平衡干净的设计与浏览器限制_Javascript - Fatal编程技术网

Javascript 平衡干净的设计与浏览器限制

Javascript 平衡干净的设计与浏览器限制,javascript,Javascript,我正在尝试设计一个接口,它是MVC/MVP设计的模型部分,可以表示远程存储在服务器上或本地的数据。要做到这一点,需要我的接口是异步的,即我将从模型中请求一些数据,回调将提供实际数据。然而,模型也可以本地存储,也就是说,可以同步地满足请求 我遇到的问题是,为了生成视图,可能会有很多对模型的调用,但是如果模型是同步的,那么这可能会导致堆栈溢出,因为每个回调都在更深一层递归,并且没有浏览器javascript实现支持尾部递归。我曾考虑过使用setTimeout,但最小延迟是4ms,在我的chrome版

我正在尝试设计一个接口,它是MVC/MVP设计的模型部分,可以表示远程存储在服务器上或本地的数据。要做到这一点,需要我的接口是异步的,即我将从模型中请求一些数据,回调将提供实际数据。然而,模型也可以本地存储,也就是说,可以同步地满足请求

我遇到的问题是,为了生成视图,可能会有很多对模型的调用,但是如果模型是同步的,那么这可能会导致堆栈溢出,因为每个回调都在更深一层递归,并且没有浏览器javascript实现支持尾部递归。我曾考虑过使用setTimeout,但最小延迟是4ms,在我的chrome版本中,任何遇到堆栈溢出的东西都会超过10k,如果使用setTimeout超过40s,速度会慢得令人无法接受!由于所有这些不必要的4ms等待迭代之间通过模型

所以我想知道如何解决这个问题,我没有想出任何好的解决办法。浏览器似乎不能满足我的需要,而且我不能有两个不同的界面——一个用于本地,一个用于远程——因为调用代码不必在意

更新:以下是递归的来源:

我在这里使用continuation.js转换同步外观代码:

function test2() {
    var i
    for (i=0;i<10;i++) {
        AJaX(some_query+i,cont(tab))
        console.log(tab.status)
    }
}
为此:

function test2() {
  var i, tab;
  i = 0;
  function _$loop_0(_$loop_0__$cont) {
    if (i < 10) {
      AJaX(some_query + i, function (arguments, _$param0) {
        tab = _$param0;
        console.log(tab.status);
        i++;
      _$loop_0(_$loop_0__$cont);
      }.bind(this, arguments));
    } else {
      _$loop_0__$cont();
    }
  }                                                                                          
  _$loop_0(function () {
  });
}

我不明白为什么每次回调都会在更深一层递归?在我们获得对setImmediate之类的强大支持之前,您可以使用postMessage对快速异步事件进行排队-例如,检查这个实现。我更新了这个问题,以展示迭代如何转化为递归的示例。在异步情况下,这不是问题,因为它是解耦的。@Sacho谢谢,我将查看postMessage,这可能会满足我的需要。。。