2012-03-11 68 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