无法通过recursion调用node.js中的函数从promiese获得响应

使用node.js Q承诺库我怀疑这是recursion调用一个函数是有用的。 我已经尝试了两种方法来解决我的问题。第一种方法,我试图直接从recursion函数返回而在第二种方法,我试着用Q诺库。

这里是我从那里调用recursion函数的代码,并期待在这里的响应。

function getSearchedUserInTree(userId,body){ var deferred = Q.defer(); var loggedInUserId = userId; var searchUserIdSql = "SELECT rc.user_id,CAST(b.node_id AS CHAR) AS node_id FROM refer_codes AS rc LEFT JOIN btrees AS b ON b.user_id=rc.user_id WHERE rc.refer_code='"+body.refer_code+"'"; connection.query(searchUserIdSql, function (err, result,field) { var getLoggedInNode = "SELECT CAST(b.node_id AS CHAR) AS node_id FROM btrees as b WHERE b.user_id='"+loggedInUserId+"'"; connection.query(getLoggedInNode, function (err, loggedResult,field) { helper.trackRelation(loggedResult[0].node_id,result[0].node_id,function(err,relationResult){ if(err) throw err; deferred.resolve(relationResult); }); }); }); return deferred.promise; } 

第一种方法获得带有承诺的“trackRelation()”函数的返回。

 function trackRelation(parentNode,childNode){ var deferred = Q.defer(); var childNodeId = bigInt(""+childNode+""); var parentNodeId = bigInt(""+parentNode+""); if(bigInt(childNodeId).compare(parentNodeId) == 0){ var childSql = "SELECT * FROM users WHERE id='"+childNodeId.toString()+"'"; connection.query(childSql,function(err,packResult,field){ console.log(packResult); deferred.resolve({status:200,message:'success',packResult}); }); }else{ /* Detact position */ if(bigInt(childNodeId).mod(2) == 0){ var tempParentNodeId = bigInt(childNodeId).divide(2); }else{ var subResult = bigInt(childNodeId).subtract(1); var tempParentNodeId = subResult.divide(2); } /** If reached at top but parent not found **/ if(bigInt(tempParentNodeId).compare(1) == 0){ var childSql = "SELECT * FROM users WHERE id='"+tempParentNodeId.toString()+"'"; connection.query(childSql,function(err,packResult,field){ console.log(packResult); deferred.resolve({status:200,message:'success',packResult}); }); }else{ return trackRelation(parentNodeId,tempParentNodeId.toString()); } } return deferred.promise; } 

第二种方法从recursion函数返回,直接返回没有承诺的值。

 function trackRelation(parentNode,childNode){ var deferred = Q.defer(); var childNodeId = bigInt(""+childNode+""); var parentNodeId = bigInt(""+parentNode+""); if(bigInt(childNodeId).compare(parentNodeId) == 0) { deferred.resolve({status:200,message:'success',topUserId:childNodeId.toString()}); return childNodeId.toString(); }else { /* Detact position */ if(bigInt(childNodeId).mod(2) == 0){ var tempParentNodeId = bigInt(childNodeId).divide(2); }else { var subResult = bigInt(childNodeId).subtract(1); var tempParentNodeId = subResult.divide(2); } /** If reached at top but parent not found **/ if(bigInt(tempParentNodeId).compare(1) == 0){ return tempParentNodeId.toString(); }else { return trackRelation(parentNodeId,tempParentNodeId.toString()); } } return deferred.promise; } 

我没有从这两种方法得到任何回应。 我试图打印值,我需要在控制台的响应,我得到了相同的值,但无法得到响应的价值。

从callback中获得回报的方式,您无法从承诺中获得回报。

你的方法trackRelation返回一个promise,它的值应该使用.then()方法来访问。

例:

 trackRelation(args).then(function(res){ //when the promise resolves, this method is called }, function(err){ //when the promise rejects, this method is called }); 

在这里检查API参考页面。