Javascript 平衡干净的设计与浏览器限制
我正在尝试设计一个接口,它是MVC/MVP设计的模型部分,可以表示远程存储在服务器上或本地的数据。要做到这一点,需要我的接口是异步的,即我将从模型中请求一些数据,回调将提供实际数据。然而,模型也可以本地存储,也就是说,可以同步地满足请求 我遇到的问题是,为了生成视图,可能会有很多对模型的调用,但是如果模型是同步的,那么这可能会导致堆栈溢出,因为每个回调都在更深一层递归,并且没有浏览器javascript实现支持尾部递归。我曾考虑过使用setTimeout,但最小延迟是4ms,在我的chrome版本中,任何遇到堆栈溢出的东西都会超过10k,如果使用setTimeout超过40s,速度会慢得令人无法接受!由于所有这些不必要的4ms等待迭代之间通过模型 所以我想知道如何解决这个问题,我没有想出任何好的解决办法。浏览器似乎不能满足我的需要,而且我不能有两个不同的界面——一个用于本地,一个用于远程——因为调用代码不必在意 更新:以下是递归的来源: 我在这里使用continuation.js转换同步外观代码:Javascript 平衡干净的设计与浏览器限制,javascript,Javascript,我正在尝试设计一个接口,它是MVC/MVP设计的模型部分,可以表示远程存储在服务器上或本地的数据。要做到这一点,需要我的接口是异步的,即我将从模型中请求一些数据,回调将提供实际数据。然而,模型也可以本地存储,也就是说,可以同步地满足请求 我遇到的问题是,为了生成视图,可能会有很多对模型的调用,但是如果模型是同步的,那么这可能会导致堆栈溢出,因为每个回调都在更深一层递归,并且没有浏览器javascript实现支持尾部递归。我曾考虑过使用setTimeout,但最小延迟是4ms,在我的chrome版
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,这可能会满足我的需要。。。