2014-10-27 34 views
0

我有一系列遞歸承諾,它們遍歷層次結構,獲取當前節點的父節點,直到到達頂端。我可以得到好的結果,但我不知道如何存儲結果。我正在使用Bluebird創建getNodeData承諾。向數組中添加遞歸承諾的結果

var getParent = function(node) { 
    getNodeData(node) 
     .then(function(node) { 
      if (term.parent) { 
       getParent(node.parent); 
      } else { 
       //return all the nodes as an array 
      } 
     }); 
    }; 
}; 
+0

如果這是異步代碼,你需要將返回承諾允許然後()「做它的工作,並讓你能夠通過承諾返回最後的數據。 'dataRetriver.getNodeData()'返回什麼? – jfriend00 2014-10-27 17:31:41

+0

總是'返回'承諾從異步功能! – Bergi 2014-10-27 19:43:17

+0

@ jfriend00 getNodeData只是用一個對象來解析葉子的細節。 – Tom 2014-10-28 10:43:20

回答

0

你需要改變你的語句返回並添加第二個函數鏈做與這些承諾的迴應什麼。

var getParent = function(term, classifier) { 
    return dataRetriver.getNodeData(node) 
     .then(function(node) { 
      if (term.parent) { 
       return getParent(node.parent); 
      } else { 
       //return all the nodes as an array 
       return node; 
      } 
     }); 
    }; 
}; 

getParent(term, classifier) 
.then(function(node){ 
    // do stuff with the node 
}); 
+1

我現在回來了,但在我的getParent.then我只收到樹的頂部葉 - 我需要整條線上樹。 – Tom 2014-10-28 10:30:03

0

在假設樹可以在沒有NODEDATA的攀爬,你可以將流程分爲兩個:

  • 遍歷樹尋找祖先節點
  • 掃描發現祖先節點收集節點數據

最後返回一個聚合承諾,它將在所有nodeData到達時解析。

整個過程最好裹在另一功能,是這樣的:

function getAncestorData(node) { 
    function getParent(arr, node) { 
     arr.push(node); 
     if(node.parent) { 
      return getParent(arr, node.parent); 
     } else { 
      return arr; 
     } 
    }; 
    var nodes = getParent([], node); 
    var promises = nodes.map(function(node) { 
     return dataRetriver.getNodeData(node); 
    }); 
    return Promise.all(promises); 
} 

,或者更簡潔:

function getAncestorData(node) { 
    function getParent(arr, node) { 
     arr.push(node); 
     return node.parent ? getParent(arr, node.parent) : arr; 
    }; 
    return Promise.all(getParent([], node).map(function(node) { 
     return dataRetriver.getNodeData(node); 
    })); 
}