2012-03-11 28 views
1

我想用回调创建分层结果。创建分层结构的嵌套函数

这是我的功能结构:

el('root', function(){ 

    el('users', function(){ 
    el('show'); 
    }); 

    el('products'); 

}); 

我想要的结果是:

assert.equal(result, [ 'root', 'root_users', 'root_users_show', 'root_products' ]); 

我在我的执行很远:http://jsfiddle.net/5ur5u/我的问题是,我提高我的深度每次调用el。它工作正常,直到它到达产品。因为节目将深度放在3上,这意味着产品将在节目结束时添加。

所以,如果任何人都可以给我一只手或者将我指向正确的方向,那将会很棒。

+0

这是棘手,因为'el'不能(在一个健全的方式)知道它被称为哪个级别。将函数'el'传递给回调函数可能会更好,每次回调都不相同。 – pimvdb 2012-03-11 14:02:30

+0

你的意思是el('root',function(el){el('users')});? – Pickels 2012-03-11 14:09:50

+0

是的 - 请参阅我的回答。 – pimvdb 2012-03-11 14:11:29

回答

1

这确实是你所要求的

var names = []; 
var result = []; 

function el(name, f) 
{ 
    names.push(name); 
    result.push(names.join("_")); 
    f && f(); 
    names.pop(); 
} 

el("root", function(){ 
    el("users", function(){ 
     el("show") 
    }); 
    el("products"); 
}); 

alert(result); 
+0

Bah,为我的所作所为感到自豪,但这是好一百万倍。 – Pickels 2012-03-11 14:43:19

1

由于el是每次调用时的非常相同的功能,就没有办法之间它被称为在一个电平(show)或另一个(products)来区分。您可以每次调用el时递增级别,但无法知道何时递减它,因为没有像调用JavaScript的“相反”的东西。

稍微好一点的选择是将新函数传递给回调函数(可以给它同名el),这是不同的,因此每个级别都有自己的el函数。这样,结果可以正确建立:http://jsfiddle.net/5ur5u/2/

var result = []; 

function el(name, fn) { 
    result.push(name); // add current name 

    if(fn) { // if there is a function 
     fn(function(name2, fn2) { // call the function with a new function 
      el(name + "_" + name2, fn2); // which calls `el` recursively 
             // with the names combined 
     }); 
    } 
} 

el('root', function(el) { 

    // this `el` refers to the function passed as declared above, 
    // which is not the same one as the initial `el` 
    el('users', function(el) { 
    el('show'); 
    }); 

    el('products'); 

}); 
+0

+1我喜欢它,你的解决方案如何简化库代码,但使得url映射更加冗长(额外的el参数)。 – Pickels 2012-03-11 14:22:27

2

你非常接近。你只需要在最后减少深度。见http://jsfiddle.net/Z2qsy/

不是

depth += 1; 
fn(); 

做这个

depth += 1; 
fn(); 
depth -= 1; 
+0

+1 This works great;我忽略了这一点。 – pimvdb 2012-03-11 14:17:32

+0

认为你忘了点击jsfiddler中的更新。以下是与您的补丁有关的工作示例的链接。 http://jsfiddle.net/Z2qsy/1/ – Pickels 2012-03-11 14:18:57