Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 递归nodejsmysql查询_Node.js_Asynchronous_Recursion - Fatal编程技术网

Node.js 递归nodejsmysql查询

Node.js 递归nodejsmysql查询,node.js,asynchronous,recursion,Node.js,Asynchronous,Recursion,我想执行一个递归函数,从数据库中检索数据。在php中,下面的代码以15毫秒的速度运行 function GetSubCategories($catno,&$subcats, $useactive=true){ global $dbconn; $qid = new SSQL($dbconn, "SELECT categoryno FROM article_category WHERE parent = '$catno'".($useactive?" AND active =

我想执行一个递归函数,从数据库中检索数据。在php中,下面的代码以15毫秒的速度运行

function GetSubCategories($catno,&$subcats, $useactive=true){
   global $dbconn;

   $qid = new SSQL($dbconn, "SELECT categoryno FROM article_category WHERE parent = '$catno'".($useactive?" AND active = 'Y'":"")." ORDER BY sortorder");
   if ($qid->query()){
      while($catrow=$qid->fetch_array()){
        $subcats[]=$catrow["categoryno"];
        GetSubCategories($catrow["categoryno"],$subcats, $useactive);
      }
    }
}

我是nodejs环境的新手,在这种情况下异步会造成麻烦。 如果我在js中编写相同的coe,程序将在第一次迭代后退出。我可以将进程与wait同步,但执行时间会爆炸

我尝试了很多有承诺的事情,比如

var getSubcategoriestest = function(categoryno,subcats, useactive=true){
return new Promise(async function (resolve) {
    const query = `SELECT categoryno FROM article_category WHERE ?? = ? ${useactive?" AND active = 'Y'":""} ORDER BY sortorder`
    let rows = await mysqlConn.query(query,['parent',categoryno])
    resolve(rows)
}).then((rows)=>{
    for (row of rows){
        console.log(row.categoryno)
        return new Promise(async function (resolve) {
            await getSubcategoriestest(row.categoryno,subcats, useactive)
            resolve()
        }).then(()=>{console.log('end')})
    } 
})
}

但没有什么是好的

有大师能帮我吗

谢谢

杰里米


我测试这个代码

var getSubcategoriestest = async function(categoryno,subcats, useactive=true,arrPromise=[]){

let promise = new Promise(function (resolve,reject) {
    const query = `SELECT categoryno FROM article_category WHERE ?? = ? ${useactive?" AND active = 'Y'":""} ORDER BY sortorder`
    mysqlConn.query(query,['parent',categoryno]).then((rows)=>resolve(rows)).catch(err=>console.log(err))
}).then((rows)=>{
        for (row of rows){
            getSubcategoriestest(row.categoryno,subcats, useactive,arrPromise).then((rows)=>{subcats.push(row.categoryno)})
        }
        return row.categoryno

}) 

arrPromise.push(promise)

Promise.all(arrPromise).then(function() {
    console.log("promise all,") 
    return 
}).catch(err=>console.log(err))
}

但函数总是在第一次迭代之后结束。Promise.all多次调用(我想每次迭代都会导致绑定)。。。头痛,头痛,头痛

开始了

var getSubcategoriestest = function (categoryno,subcats) {

   const query = `SELECT c FROM ac WHERE ?? = ? ORDER BY sortorder`

   return mysqlConn.query(query,['parent',categoryno]).then(rows => {   
        return Promise.all(rows.map(row => {
            subcats.push(row.categoryno);
            return getSubcategoriestest(row.categoryno, subcats,useactive);
        }));
   })}

rows.map生成承诺数组导致getSubcategoriestest返回承诺。您可以在promise.all之后添加一个thin。

在循环中尝试promise.all。对于每个元素,在数组中添加承诺并运行代码。应该更快。wait关键字停止执行并等待结果,而promise all并行运行所有内容谢谢回复,是的,我读过这方面的内容,但要做到这一点,我需要为每个promise保留一个数组。没有比这更干净的了吗?顺便说一句,我会试试promise.allNo,你需要一个数组。只要兑现其中的每一个承诺。你做到了。然后((res)=>你可以很好地运行你想要的)。catch(如果有错误)我已经编辑了我的问题,我尝试过这种方法,但没有成功。谢谢你的时间