如图 关于回调嵌套  查询一条数据的 id 将查到的id作为下一条数据的 父id,想要实现这功能应该怎么改!

解决方案 »

  1.   

    不要直接for,做成一个函数循环调用,然后再查询回调里面传入上次查询返回的参数,而且不要发截图,很讨厌参考:for循环遍历如何延时执行Web开发学习资料推荐
    JavaScript apply与call的用法及区别
    jqGrid中文API
      

  2.   


    function insert(i,id){
    SqliteUtil.executeSql(db,"SELECT id FROM TABLE_NAME WHERE name='"+arr[i-1]+"'"),null,function(res){
    var pid = res.rows.item(0).id;
    SqliteUtil.executeSql(db,"INSERT INTO TABLE_NAME (name,pid) VALUES ('"+arr[i]+"',"+pid+")",null,function(res){
    insert((i+1), res.insertId);
    },null);
    },null);
    }
    不行哦,插入语句还是在最后,这时候,查询出来的是没有这条数据的,而不是一条查询,一条插入  
      

  3.   

    你这个结构不就是查询上一条的id后作为下一条的pid,没看出有什么问题。查询上一条的id的sql语句还有多了个),代码错了如果你意思是,数据库中都没有数组中的值,需要按照关系插入,那么i=0的时候应该先执行插入操作,将返回的插入id放到下次插入中,都不需要查询了
      

  4.   

    你这个结构不就是查询上一条的id后作为下一条的pid,没看错什么问题。查询上一条的id的sql语句还有多了个),代码错了insert(1)
    嗯,是多了个) , 比如 arr.length == 4 这时候他会查询4次后 在去执行插入语句,所以,因为没有插入,所以查询时候数据中没有这条数据
      

  5.   

    你这个结构不就是查询上一条的id后作为下一条的pid,没看错什么问题。查询上一条的id的sql语句还有多了个),代码错了insert(1)
    嗯,是多了个) , 比如 arr.length == 4 这时候他会查询4次后 在去执行插入语句,所以,因为没有插入,所以查询时候数据中没有这条数据看你结构就是查询,然后执行插入,在执行下一次操作,没问题啊如果是都循环完毕了再插入,那就是数据库可能做了什么缓存插入,一定间隔内执行多条语句什么的延时插入。。你用的什么数据库,sqlite?
      

  6.   

    你这个结构不就是查询上一条的id后作为下一条的pid,没看错什么问题。查询上一条的id的sql语句还有多了个),代码错了insert(1)
    嗯,是多了个) , 比如 arr.length == 4 这时候他会查询4次后 在去执行插入语句,所以,因为没有插入,所以查询时候数据中没有这条数据看你结构就是查询,然后执行插入,在执行下一次操作,没问题啊如果是都循环完毕了再插入,那就是数据库可能做了什么缓存插入,一定间隔内执行多条语句什么的延时插入。。你用的什么数据库,sqlite?
    对的,是sqlite ,应该不是数据库的问题,我觉得是异步调用的问题?,数据查询成功,在成功的回调中进行插入数据,接着在插入成功的回调中循环函数。
      

  7.   

    和异步没关系,你的数据库如果不存在name='a'的记录就无法继续了,我这里直接测试没有问题的。<script>
        var arr = ['a', 'b', 'c', 'd', 'e'];    var db = openDatabase('test', '1.0.0', '', 65535);
        db.transaction(function (t) {
            t.executeSql('create table if not exists test(id INTEGER PRIMARY KEY AUTOINCREMENT,name text,pid int)', null,
                function () {
                    t.executeSql('delete from test', null, function () {
                        console.log('delete ok')
                        t.executeSql("insert into test(name,pid)values('" + arr[0] + "',0)", null, function () {
                            console.log('insert ok')
                            Insert(1);
                        }, function () { console.log(arguments) })
                    }, null)
                }, null);    });
        function Insert(i) {
            db.transaction(function (t) {
                t.executeSql("select id from test where name='" + arr[i - 1] + "'", null, function (t, rs) {
                    var id = rs.rows.item(0).id;
                    console.log(id)
                    t.executeSql("insert into test(name,pid)values('" + arr[i] + "'," + id + ")", null, function () {
                        if (i + 1 < arr.length) Insert(i + 1);
                        else {//arr全部插入,查看数据库记录
                            t.executeSql('select * from test', null, function (t, rs) {                            alert(JSON.stringify(rs.rows))
                            })
                        }
                    }, null);
                }, function () { console.log('查询id失败') })
            })
        }
    </script>