如何在递归中,操作完成才返回数据?
发布于 9 年前 作者 ilovelll 5100 次浏览 最后一次编辑是 8 年前 来自 问答
function formatData(err, data, pid) {
    db.execSQL(
        'SELECT id FROM category WHERE pid = ?',
        [pid], function (err, result) {
            for(var j in result) {
                data.push(result[j].id)
            }
            if(result.length>0) {
                for(var i in result){
                    formatData(err, data, result[i].id);
                }
            }
        }
    );
    return data;
}

db.execSQL为封装的数据库操作,第一个参数是sql语句,第二个是sql参数,第三个为回调函数 如何在所有递归操作完成之后才返回数据?

7 回复

return 上移两行

1楼大神能解释下不? 感觉挺抽象的 @dayuoba

这样的结构是不行的,至少要使用 callback

var counter = 0;

function formatData(err, data, pid, cb) {
    counter++;

    db.execSQL(
        'SELECT id FROM category WHERE pid = ?',
        [pid], function (err, result) {
            counter--;
            for(var j in result) {
                data.push(result[j].id);
                formatData(err, data, result[j].id, cb)
            }
            if (counter == 0) {
            	cb(data);
            }
        }
    );
}

formatData(null, [], 1, function(data) {
    // deal with your data here
});

sorry,我没仔细读代码, 你得写流程控制,所有的任务执行完毕之后,把data传给callbak,callback(data)

promise 封装后异步控制就很简单了

callback是必须的

回到顶部