我正在尝试使用Mustache.js构建一个html树,但它无法抛出"超出最大调用堆栈大小",可能是因为无限递归.
怎么了?
var Mustache = require('mustache');
var root = {
title: 'Gar1',
children: [{title: 'gar2'}, {title: 'gar3', children: [{title: 'gar4'}]}]
};
var panelTemplate = '{{title}}<ul>{{#children}}<li>{{>panel}}</li>{{/children}}</ul>';
var partials = {panel: panelTemplate};
var output = Mustache.render(panelTemplate, root, partials);
console.log(output);
Run Code Online (Sandbox Code Playgroud) Om,反应的clojurescript包装,据说非常快,因为它利用了不变性.我无法理解持久性数据结构如何在这里提供帮助.
我所理解的是应用状态是一个原子.此状态传递给返回虚拟DOM节点的函数(om组件),因此创建当前虚拟DOM与其先前状态之间差异的"补丁"比直接在实际DOM上操作要好得多.
但是持久数据结构可以在这里提供帮助吗
(def app-state (atom {:foo {:counter 0}))
(om/root click-counter app-state {:target ...})
Run Code Online (Sandbox Code Playgroud)
例如,click-counter渲染一个按钮,单击该按钮会增加计数器.所以过渡函数看起来像这样:
(dom/button #js {:onClick #(om/transact! app [:foo :counter] inc)}
(str "clicked " (-> app :foo :counter) " times"))
Run Code Online (Sandbox Code Playgroud)
我没有理解这一点:onClick执行时clojurescript创建一个新的地图(非常有效),如下所示:
{:foo {:counter 1}}
Run Code Online (Sandbox Code Playgroud)
而app-state现在指向新的地图.此时Om意识到状态已经改变,因为它只是一个等式检查的问题.
这里的问题是Om应该仍然计算整个旧虚拟DOM和新虚拟DOM之间的差异.它不知道只是计数器被改变了.
我的错误在哪里?
我试图创建一个小的基准(在Groovy中),显示几个同步方法的高线程争用.监控自愿上下文切换时应该出现高争用,而在Linux中,这可以通过"pidstat"来实现.
该计划如下:
class Res {
private int n;
synchronized public void inc() {
n++;
def foo = []
for (int i = 0; i < 1000; ++i) foo << "hello"
}
synchronized public int getN() {
return n;
}
}
while (true) {
Res res = new Res()
int N = 100000
for (int i = 0; i < N; ++i) {
new Thread({
res.inc()
if (res.getN() == N) {
println "ok"
}
}).start()
}
while (res.getN() < N) { …Run Code Online (Sandbox Code Playgroud)