2017-11-02 7 views
0

私のアプリケーションでは、ユーザは私の剣道グリッドの複数の行を更新することができます。その情報が私のデータベースに保存された後、私は行を更新する必要があります。しかし、私が行うことができる唯一の方法は、これらのレコードを更新するために私のパーティションとグリッドのすべての行を反復することです。長時間実行されるスクリプトを最適化する方法

これは、長時間実行されるスクリプトエラーの原因となり、永遠にかかります。ブラウザをロックアップします。私の質問は、別のスレッドやバックグラウンドで発生するように自分のイテレーションを最適化する方法はありますか?または、私はレコードを更新することができるより速い方法です。

//maingrid contains 400 records 
//10 partitions containing 10 rows changed by user 
//100 records needing to be updated. 

function updateAssignmentsInUI(partitions) { 

    for (var i = 0; i < partitions.length; i++) { 

     for (var j = 0; j < partitions[i].length; j++) { 

      var mainGrid = $("#mainGrid").data("kendoGrid"); 
      $.each(mainGrid.dataSource.data(), function() { 

       if (this.RowSelected === true) { 

        if (this.ID === partitions[i][j].ID) { 
         var row = mainGrid.dataSource.getByUid(this.uid); 
         row.set("Changed", "Yes"); 
        } 
       } 
      }); 
     } 
    } 

} 

これは、10個のパーティションをループその後、10件のレコードをループし、maingridで400のレコードのリスト全体のレコードを検索します。したがって、ユーザーがコントロールを再度取得するまでにかかる時間を想像することができます。

+0

[promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) – emed

+0

@emed:を使用すると、ブラウザは完全な状態になるまでフリーズします。 – NeoSketo

答えて

1

クエリを変更/キャッシュするだけです。私は、これは非常に役立ちます知っているが、あなたのmainGridがキャッシュされます。この

//maingrid contains 400 records 
//10 partitions containing 10 rows changed by user 
//100 records needing to be updated. 

function updateAssignmentsInUI(partitions) { 
    var mainGrid = $("#mainGrid").data("kendoGrid"); 
    $.each(mainGrid.dataSource.data(), function() { 
     if (this.RowSelected === true) { 
      for (var i = 0; i < partitions.length; i++) { 
       for (var j = 0; j < partitions[i].length; j++) { 
        if (this.ID === partitions[i][j].ID) { 
         var row = mainGrid.dataSource.getByUid(this.uid); 
         row.set("Changed", "Yes"); 
        } 
       } 
      } 
     } 
    }); 
} 

この方法のようにあなたのコードを使用しようと、あなたはそれを複数回照会しないであろうとも文句を言わないあなたにも、それのデータを検索しません。行が選択されていない場合、高価なn^2ループを実行しません。 実用デモ(簡略化): https://plnkr.co/edit/n3ZHmlqtoKZP4UQikw2A?p=preview

n^2ループ用。私はそれを最適化するために多くを知っていない、より多くのアルゴリズムの達人を求める。

+0

ありがとう!しかし、私はそのような大きなデータを扱っているため、私の違いはほとんど見えませんでした。それは助けになった。 – NeoSketo

+0

上記のコードは多くの問題を解決するはずですが、最後の手段として非同期操作にsetTimeoutを使用することができます。それでも同じCPUが必要になりますが、キュー内で動作させることができます –

関連する問題