2017-10-21 87 views
0

我是新來的JavaScript的承諾,並試圖解決後續問題:遍歷JavaScript的承諾樹

有與具有這樣的

node: {id, children:node[]} 

一個節點的結構是通過調用接收節點樹

getNode(id) 

其中getNode返回一個JavaScript承諾

所以我通過

getNode(id).then(function(node) { 
    id = node.id; 
    children = node.children; 

})獲得一個節點對象

現在,我想在一個對象整棵樹就像

treeObject = getTree(rootNodeId) 

使得treeObjects應爲例子的最後內容

{1,children: 
     [{2,children 
       [{5,null},{6,null},{7,null]}, 
      {3,children[{8,null},{9,null]}... 

??? 感謝您的任何答案!

+1

聽起來像是你需要一個遞歸函數? – evolutionxbox

+0

什麼是孩子? –

+0

你有什麼問題滿足要求? – guest271314

回答

2
async function getTree (id){ 
    const node = await getNode(id); 
    node.children = await Promise.all(node.children.map(getTree)); 
    return node; 
} 

或不異步等待:

function getTree (id){ 
    return getNode(id).then(function(node){ 
    return Promise.all(node.children.map(getTree)).then(function(children){ 
     node.children = children; 
     return node; 
    }); 
}); 
} 

假設兒童是ID列表

+0

這似乎是一個很好的解決方案。不幸的是,我的瀏覽器不支持異步/等待,但只支持Promise。到現在爲止,我還沒有設法將此解決方案轉換爲僅有Promise的版本。也許有人可以幫助這個?提前致謝! – Wieland

+0

@Wieland Jonas用一個不需要'async'的代碼版本更新了他的答案。 – JLRishe

+0

@wieland,jup編輯。 –