2017-04-20 103 views
1

嗨那里我有以下python递归函数,从所有子节点求和值,我想在NodeJS中端口,但我有一些异步调用的问题。NodeJS - 总结异步结果的递归函数

def getTree(parent_id, level=1): 
    c.execute('select * from users where parent_id=?', (parent_id,)) 
    rows = c.fetchall() 
    total = 0 
    for child in children: 
     total += getAsyncValue(child.id) 
     total += getTree(child.id, level+1) 
    return total 

我试图做到这一点,但我可能需要与承诺链,因为总次数不可用,而我循环,因为我得到它从一个异步函数

getTree = function(parent_id, level=1) { 
    c.all("select * from users where parent_id="+parent_id, function(err, children) { 
    var total = 0; 
    children.forEach(function(child) { 
     total += getAsyncValue(child.id) 
     total += getTree(child.id, level+1) 
    }); 
    return total; 
    }); 
} 
+0

一种方式更容易港口这一代码将ES2016 +'异步/ await'(这是刚刚与含糖善良少辉) - 只使用承诺(因此更好的浏览器兼容性)是一个涉及多一点 –

回答

1

没有看到getAsyncValue我不能提供一个完整的答案 - 但是

var getAsyncValue = function(id) { 
    return new Promise((resolve, reject) => { 
     // resolve some value some how 
    }); 
}; 
// helper to make the getTree function "nicer" 
c.allAsync = function(str) { 
    return new Promise((resolve, reject) => 
     this.all(str, (err, children) => { 
      if (err) { 
       return reject(err); 
      } 
      resolve(children); 
     }) 
    ); 
}; 
var getTree = function(parent_id, level=1) { 
    return c.allAsync("select * from users where parent_id="+parent_id).then(children => 
     Promise.all(children.map(child => 
      Promise.all([getAsyncValue(child.id), getTree(child.id, level+1)]) 
      .then(([a, b]) => a + b) 
     )).then(results => results.reduce((a, b) => a + b)) 
    ); 
}; 

利用认为异步/ AWAIT,代码可以写为:

var getAsyncValue = async function(id) { 
    return new Promise((resolve, reject) => { 
     // resolve some value some how 
    }); 
}; 
// helper to make the getTree function "nicer" 
c.allAsync = async function(str) { 
    return new Promise((resolve, reject) => 
     this.all(str, (err, children) => { 
      if (err) { 
       return reject(err); 
      } 
      resolve(children); 
     }) 
    ); 
}; 
var getTree = async function(parent_id, level=1) { 
    let children = await c.allAsync("select * from users where parent_id="+parent_id); 
    let total = 0; 
    for (let i = 0; i < children.length; i++) { 
     let child = children[i]; 
     total += await getAsyncValue(child.id); 
     total += await getTree(child.id, level + 1); 
    } 
    return total; 
}; 
+0

是,谢谢!我的问题是创建嵌套的Promise.all我认为是非常冗长而不使用等待 – frx08