首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步SQL insert in循环

异步SQL insert in循环
EN

Stack Overflow用户
提问于 2012-05-12 01:21:11
回答 3查看 988关注 0票数 2

在SQL数据库中插入行时遇到问题。我想在javascript中将一个对象数组转换成一个SQL表。

下面的代码只添加数组的第一个对象。我尝试了在stackoverflow和其他地方找到的所有东西,但都不能正常工作。

任何帮助都将不胜感激。谢谢。

代码语言:javascript
运行
复制
        for (var i = 0; i < arr.length; i++) {
            db.save({key:i+"", value:arr[i]}, function(e){

            });
        }

更新1:我已将其更改为mathec的示例,并缩小了问题的范围。

插入的行数取决于要插入的对象的大小。因此,它与处理每个对象所需的时间有关。

我如何解决这个问题?谢谢。

更新2:

我采纳了Robert Young的建议,并包含了一个自包含的示例。

下面的示例只插入前5个元素。如果我删除了test key中的一些单词文本,使得它只说' word‘一次,那么就会插入10个元素。所以现在我确定这与处理每个对象所需的时间有关。

代码语言:javascript
运行
复制
<html>
    <head>
        <script src="jquery.js"></script>
        <script src="lawnchair.js"></script>
        <script type='text/javascript'>


            var db = "";
            var arr = [];

            arr.push({name:"a1", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a2", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a3", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a4", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a5", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a6", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a7", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a8", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a9", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a10", test:"word word word word word word word word word word word word word word "});
            arr.push({name:"a11", test:"word word word word word word word word word word word word word word "});

            $(function() {
                db = new Lawnchair({table:'t50'}, function(e){
                    for ( i = 0; i < arr.length; i++) {
                        (function(i) {
                            add_row(i);
                        }(i));
                    }
                });
            });

            function add_row(i) {
                db.save({key:i+"", value:arr[i]}, function(e){

                });
            }

        </script>
    </head>
    <body>

    </body>
</html>

更新3:我使用了Robert的建议代码,并提出了以下三个小元素。因此,我更改了第一个元素,使其比其他元素更大以测试它。第一个元素没有添加,最后两个是添加的。处理数组有时间限制吗?

代码语言:javascript
运行
复制
<html>
    <head>
        <script src="jquery.js"></script>
        <script src="lawnchair.js"></script>
        <script type='text/javascript'>

            var arr = [];
            var db = "";

            $(function() {
                db = new Lawnchair({table:'t51'}, function(e){
                    arr=[{key:"k1", value:"v1. Because the contents of this element are larger than the others it will not be added for some reason. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. "}
                    ,{key:"k2", value:"v2"}
                    ,{key:"k3", value:"v3"}]

                    db.batch(arr, function () {
                        db.all(function (recs) { for (r in recs) {console.log(recs[r].key +"| "+ recs[r].value) } });
                    });
                });

            });

        </script>
    </head>
    <body>
    </body>
</html>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-12 13:51:05

首先,由于这是持久化存储,如果您一遍又一遍地运行它,您可能每次都会得到不同的结果,因为您没有初始化持久化存储。添加db.nuke()可能会很好,以确保您从白板开始,至少在您找出任何bug之前是这样。

关于异步存储,要知道的主要一点是,仅仅因为函数返回并不意味着数据实际上已经存储。所以如果你运行

代码语言:javascript
运行
复制
db = new Lawnchair(function(db){
    db.save({key:"value"})
    db.get("foo", function (rec) { console.log(rec.value) });
});

它可能会工作,也可能不会工作,因为当您调用db.get时,值可能会存储,也可能不会存储。

要使其正常工作,我们需要确保在调用db.get之前存储了该值。实现这一点的方法是使用回调--如果您将两个参数传递给db.save,那么一旦存储值,它就会调用第二个参数。所以

代码语言:javascript
运行
复制
db = new Lawnchair(function(db){
    db.save({key:"foo", value:"bar"}, function () {
        db.get("foo", function (rec) { console.log(rec.value) });
    });
});

工作正常。

当您尝试存储多个值时,这会变得很困难,因为您希望确保所有值都已存储。幸运的是,有一个函数batch可以做到这一点

代码语言:javascript
运行
复制
db = new Lawnchair(function(db){
    arr=[{key:"k1", value:"v1"},{key:"k2", value:"v2"},{key:"k3", value:"v3"}];
    db.batch(arr, function () {
        db.all(function (recs) { for (r in recs) {console.log(recs[r].key) } });
    });
});

应该输出

代码语言:javascript
运行
复制
k1
k2
k3

试一试,看看会发生什么。

票数 1
EN

Stack Overflow用户

发布于 2012-05-12 01:28:29

我自己犯了几次棘手的错误:-)。如果回调函数在循环内被调用,它将被异步调用。因此,您的循环将一直执行到最后。解决这个问题的一种方法是在当前i值周围形成一个闭包,这样当回调函数执行时,它就被绑定到右边的i。类似这样:

代码语言:javascript
运行
复制
function doSomething(i) {
  console.log(i)
}

var i, len;

for ( i = 0; i < 10; i++) {
  (function(i) {
    doSomething(i);
  }(i));
}

循环中的函数将立即执行,但i值将保留在作用域中。

票数 2
EN

Stack Overflow用户

发布于 2012-05-12 12:36:00

很难缩小问题的解决方案,因为我们不知道如何将数据保存到数据库中,也许是AJAX请求?,但我认为问题出在异步保存数组的每一行的整个逻辑中,因为代码不会等待保存一行才开始另一行,所以发生了某种竞争条件,一些行被保存在相同的"id“(自动增量字段)中,这解释了为什么只保存一些行。

我的建议是将整个数组发送到服务器,然后保存每一行。

当然,您可以对每一行执行此操作,首先锁定id,然后保存数据,但这不是一个好主意,因为您需要往返于服务器和每一行的DB之间,从而使服务器的请求量加倍。

希望它能帮上忙!

P.D. +1 to @mathec回答指出有回调问题的循环变量!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10555887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档