2

SQLデータベースに行を挿入するのに問題があります。オブジェクトの配列をjavascriptのSQLテーブルに変換したいと思います。

次のコードは、配列の最初のオブジェクトのみを追加します。私はstackoverflowや他の場所で見つけたすべてを試しましたが、動作させることができません。

どんな助けでもいただければ幸いです。ありがとう。

        for (var i = 0; i < arr.length; i++) {
            db.save({key:i+"", value:arr[i]}, function(e){

            });
        }

更新1:mathecの例に変更し、問題を少し絞り込みました。

挿入される行数は、挿入されるオブジェクトのサイズによって異なります。つまり、各オブジェクトの処理にかかる時間と関係があります。

この問題を回避するにはどうすればよいですか?ありがとう。

アップデート2:

以下のRobertYoungの提案を参考にして、自己完結型の例を含めました。

以下の例では、最初の5つの要素のみを挿入しています。テストキーの単語テキストの一部を削除して、「単語」が1回だけ表示されるようにすると、10個の要素が挿入されます。これで、各オブジェクトの処理にかかる時間と関係があると確信しています。

<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の提案したコードを使用し、3つの小さな要素で機能する次のコードを思いつきました。そこで、最初の要素を変更して、他の要素よりも大きくしてテストしました。最初の要素は追加されず、最後の2つは追加されました。アレイの処理に時間制限はありますか?

<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>
4

3 に答える 3

2

私が何度か自分で犯したトリッキーな間違い:-)。コールバック関数がループ内で呼び出されると、非同期で呼び出されます。したがって、ループは最後まで実行され続けます。この問題を解決する方法は、現在の i 値の周りにクロージャを形成して、コールバック関数が実行されたときに右の i にバインドされるようにすることです。このようなもの:

function doSomething(i) {
  console.log(i)
}

var i, len;

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

ループ内の関数はすぐに実行されますが、i 値はスコープ内に保持されます。

于 2012-05-11T17:28:29.190 に答える
1

まず、これは永続ストレージであるため、これを繰り返し実行すると、永続ストアを初期化しないため、毎回異なる結果が得られる可能性があります。db.nuke()少なくともバグを解決するまでは、白紙の状態から始めるようにを追加することをお勧めします。

非同期ストレージについて知っておくべき主なことは、関数が返されるからといって、データが実際にまだ保存されていることを意味するわけではないということです。だからあなたが実行すると

db = new Lawnchair(function(db){
    db.save({key:"value"})
    db.get("foo", function (rec) { console.log(rec.value) });
});

db.getを呼び出すと、値が保存される場合とされない場合があるため、機能する場合と機能しない場合があります。

これを機能させるには、db.getを呼び出す前に、値が格納されていることを確認する必要があります。これを行う方法は、コールバックを使用することです。db.saveに2つの引数を渡すと、値が格納されると2番目の引数が呼び出されます。それで

db = new Lawnchair(function(db){
    db.save({key:"foo", value:"bar"}, function () {
        db.get("foo", function (rec) { console.log(rec.value) });
    });
});

正常に動作します。

複数の値を保存しようとすると、すべての値が確実に保存されるため、これは困難になります。幸いなことに、これには関数がありますbatch

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) } });
    });
});

出力する必要があります

k1
k2
k3

それを試して、何が起こるかを見てください。

于 2012-05-12T05:51:04.537 に答える
0

データをDBに保存する方法がわからないため、問題の解決策を絞り込むのは難しいですが、AJAXリクエストかもしれませんが、問題は配列の各行を非同期的に保存するロジック全体にあると思います、コードはある行が保存されて別の行が開始されるのを待たないため、ある種の競合状態が発生し、一部の行が同じ「id」(自動インクリメント フィールド) に保存され、一部の行のみが保存される理由が説明されます。 .

私の提案は、配列全体をサーバーに送信してから、各行を保存することです。

もちろん、行ごとに行うこともできます。最初にIDをロックしてからデータを保存しますが、行ごとにサーバーとDBへのラウンドトリップが必要になり、サーバーへのリクエストの量が2倍になるため、悪い考えです。

それが役に立てば幸い!

コールバックの問題でループ変数を指摘するための @mathec への PD +1 の回答!

于 2012-05-12T04:35:59.757 に答える