回调嵌套执行问题

qq_37373213 2017-11-22 10:04:50


如图 关于回调嵌套 查询一条数据的 id 将查到的id作为下一条数据的 父id,想要实现这功能应该怎么改!
...全文
219 10 点赞 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
结构肯定没有问题的,查询,插入,在执行下一次的查询,插入。。如果第二次之后查询不到值,那肯定是上一次的插入没有成功导致的,被延时插入了之类,或者你的这个js类库做了什么缓存插入
  • 打赏
  • 举报
回复
qq_37373213 2017-11-22
引用 5 楼 showbo 的回复:
[quote=引用 4 楼 qq_37373213 的回复:] [quote=引用 3 楼 showbo 的回复:] [quote=引用 2 楼 qq_37373213 的回复:] 不行哦,插入语句还是在最后,这时候,查询出来的是没有这条数据的,而不是一条查询,一条插入
你这个结构不就是查询上一条的id后作为下一条的pid,没看错什么问题。查询上一条的id的sql语句还有多了个),代码错了 insert(1)[/quote] 嗯,是多了个) , 比如 arr.length == 4 这时候他会查询4次后 在去执行插入语句,所以,因为没有插入,所以查询时候数据中没有这条数据[/quote]看你结构就是查询,然后执行插入,在执行下一次操作,没问题啊 如果是都循环完毕了再插入,那就是数据库可能做了什么缓存插入,一定间隔内执行多条语句什么的延时插入。。你用的什么数据库,sqlite?[/quote] 对的,是sqlite ,应该不是数据库的问题,我觉得是异步调用的问题?,数据查询成功,在成功的回调中进行插入数据,接着在插入成功的回调中循环函数。
  • 打赏
  • 举报
回复
引用 4 楼 qq_37373213 的回复:
[quote=引用 3 楼 showbo 的回复:] [quote=引用 2 楼 qq_37373213 的回复:] 不行哦,插入语句还是在最后,这时候,查询出来的是没有这条数据的,而不是一条查询,一条插入
你这个结构不就是查询上一条的id后作为下一条的pid,没看错什么问题。查询上一条的id的sql语句还有多了个),代码错了 insert(1)[/quote] 嗯,是多了个) , 比如 arr.length == 4 这时候他会查询4次后 在去执行插入语句,所以,因为没有插入,所以查询时候数据中没有这条数据[/quote]看你结构就是查询,然后执行插入,在执行下一次操作,没问题啊 如果是都循环完毕了再插入,那就是数据库可能做了什么缓存插入,一定间隔内执行多条语句什么的延时插入。。你用的什么数据库,sqlite?
  • 打赏
  • 举报
回复
qq_37373213 2017-11-22
引用 3 楼 showbo 的回复:
[quote=引用 2 楼 qq_37373213 的回复:] 不行哦,插入语句还是在最后,这时候,查询出来的是没有这条数据的,而不是一条查询,一条插入
你这个结构不就是查询上一条的id后作为下一条的pid,没看错什么问题。查询上一条的id的sql语句还有多了个),代码错了 insert(1)[/quote] 嗯,是多了个) , 比如 arr.length == 4 这时候他会查询4次后 在去执行插入语句,所以,因为没有插入,所以查询时候数据中没有这条数据
  • 打赏
  • 举报
回复
引用 2 楼 qq_37373213 的回复:
不行哦,插入语句还是在最后,这时候,查询出来的是没有这条数据的,而不是一条查询,一条插入

你这个结构不就是查询上一条的id后作为下一条的pid,没看出有什么问题。查询上一条的id的sql语句还有多了个),代码错了

如果你意思是,数据库中都没有数组中的值,需要按照关系插入,那么i=0的时候应该先执行插入操作,将返回的插入id放到下次插入中,都不需要查询了
  • 打赏
  • 举报
回复
qq_37373213 2017-11-22
引用 1 楼 showbo 的回复:
不要直接for,做成一个函数循环调用,然后再查询回调里面传入上次查询返回的参数,而且不要发截图,很讨厌 参考:for循环遍历如何延时执行 Web开发学习资料推荐 JavaScript apply与call的用法及区别 jqGrid中文API
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); } 不行哦,插入语句还是在最后,这时候,查询出来的是没有这条数据的,而不是一条查询,一条插入
  • 打赏
  • 举报
回复
不要直接for,做成一个函数循环调用,然后再查询回调里面传入上次查询返回的参数,而且不要发截图,很讨厌

参考:for循环遍历如何延时执行

Web开发学习资料推荐
JavaScript apply与call的用法及区别
jqGrid中文API
  • 打赏
  • 举报
回复
lc_ant 2017-11-22
引用 楼主 qq_37373213 的回复:
如图 关于回调嵌套 查询一条数据的 id 将查到的id作为下一条数据的 父id,想要实现这功能应该怎么改!
你这个方法实现不了?看起来没啥问题啊
  • 打赏
  • 举报
回复
和异步没关系,你的数据库如果不存在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>
  • 打赏
  • 举报
回复
qq_37373213 2017-11-22
引用 7 楼 showbo 的回复:
结构肯定没有问题的,查询,插入,在执行下一次的查询,插入。。如果第二次之后查询不到值,那肯定是上一次的插入没有成功导致的,被延时插入了之类,或者你的这个js类库做了什么缓存插入
找了下,并没有延时插入之类的,我一直以为是异步调用的问题,不知道版主怎么看。 因为
引用 7 楼 showbo 的回复:
结构肯定没有问题的,查询,插入,在执行下一次的查询,插入。。如果第二次之后查询不到值,那肯定是上一次的插入没有成功导致的,被延时插入了之类,或者你的这个js类库做了什么缓存插入
找了下,并没有延时插入之类的,我一直以为是异步调用的问题,回调函数中嵌套回调,不知道版主怎么看。
  • 打赏
  • 举报
回复
相关推荐
发帖
JavaScript
加入

8.5w+

社区成员

Web 开发 JavaScript
申请成为版主
帖子事件
创建了帖子
2017-11-22 10:04
社区公告
暂无公告