2014-10-04 54 views
0

我使用下面的結構作爲模擬對象其功能是作爲與環連接的方法的對象,以形成對象鍵的嵌套函數目的:創建使用一個字符串數組

PlayerNull = 
    find : -> 
    populate : -> 
     exec : (callback) -> 
     callback false, false 

在我的測試我然後替代真實模型這個模仿對象和我的控制器調用每個函數又比如:

Model.find().populate().exec(callback) 

,因爲我使用了很多次發現自己,我很好奇,是否我可以創建一個幫手函數來簡化這個(略),使用一個輔助函數下面的表格:

PlayerNull = helper.mockNest ['find', 'populate', 'exec'], (callback) -> 
    callback false, false 

我已經來到了下面的函數代碼,但是這是行不通的:

exports.mockNest = (func_names, func_final) -> 
    func_names.reverse() 
    func_next = func_final 
    for func_name in func_names 
    _func_next = func_next.bind({}) 
    _next = {} 
    _next[func_name] = -> 
     _func_next 
    func_next = _func_next 
    func_next 

我來實現,我需要克隆func_next每個迴路或否則參考似乎被保留並且分配給func_next似乎改變了以前的所有分配。

回答

2

是的,你已經正確地發現了問題,引用不被維護,這是傳統的closure in a loop問題。

然而,克隆的功能並不能真正幫助在這裏,您的實際問題是

_next[func_name] = -> 
    _func_next 

它創建在_func_next變量,這是在每次循環迭代修改封閉。

它應該是

exports.mockNest = (func_names, func_final) -> 
    func_names.reverse() 
    func_next = func_final 
    for func_name in func_names 
    next = {} 
    next[func_name] = func_next 
    func_next = do (_next = next) -> 
    () -> 
     _next 
    func_next 
+0

非常感謝您解釋這個問題,並將我的注意力集中在「do」關鍵字上,非常酷,讓我度過了終點。你的最終代碼並不完全正確,我會添加一個答案並接受。 – DanH 2014-10-05 05:36:28

+0

糟糕,你是對的,它沒有工作;但解決辦法很小。與你的代碼相比,它甚至可以在空的'func_names'數組中使用。 – Bergi 2014-10-05 10:46:29

0

由於BERGI的解釋,我來到了以下解決方案:

exports.mockNest = (func_names, func_final) -> 

    # Assign the last function to the provided func_final 
    func_name_final = func_names.pop() 
    func_next = {} 
    func_next[func_name_final] = func_final 

    # Reverse the array so we build the object from last to first. 
    func_names.reverse() 
    for func_name in func_names 
    ignore = do (func_name, _func_next = func_next) -> 
     func_next = {} 
     func_next[func_name] = -> 
     _func_next 
     return 
    func_next 

爲了解釋這一變化,我需要保持供應func_final,所以我不得不在循環之前分配。

另外,我需要對do塊分配給可變ignore否則的CoffeeScript編譯該函數不同的位置在哪裏func_next作出變化做出來序。分配確保了do塊的放置。

相關問題