如何在递归中,操作完成才返回数据?
 发布于 10 年前  作者 ilovelll  5822 次预览  最后一次回复是 10 年前  来自 问答 
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 回复
dayuoba

return 上移两行

wintowanti

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

klesh

这样的结构是不行的,至少要使用 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
});
dayuoba

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

joney-pinkman

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

blackjack

callback是必须的