0

JavaScript に興味深い間違いがあります。オブジェクトのプロパティを変更できません。

Web SQL で選択するとオブジェクトが返されますが、プロパティを変更または削除しようとしても何も起こりません。この例では、オブジェクト「ノード」を作成します (Chrome で動作):

var getNode = function(callback){database = openDatabase('db', "1", "object store", 10);
    database.transaction(function(tx) {
     tx.executeSql("CREATE TABLE IF NOT EXISTS name (NodeId int, NodeName text)", [], function(tx) {
      tx.executeSql("insert into name (NodeId,NodeName) values (1,'node')",[],function(tx){
       tx.executeSql("select * from name where NodeId=1",[],function(tx,res){
        callback(res.rows.item(0));
       });
      });
     }, {});
    });
} 
getNode(function(node){
   node.NodeId=22;//change nothing
   delete node.NodeId;//return true, but doesn't delete
   console.log(node);
});


プロパティを変更できないのはなぜですか? そして、どうすればそれを行うことができますか?

4

2 に答える 2

1

コードは非同期であるため、表示される順序で実行されません。あなたの s が完了しnode=res.rows.item(0);た後に実行されるコールバックにあるため、などのに応答に設定されています.executeSqlnode node.NodeId = 22;

次のように考えてください。

  1. ノードを {} に設定
  2. executeSql
  3. node.NodeId を 22 に設定 (および node.NodeId を削除)
  4. #2 の executeSql から応答を取得し、node を応答の最初の行に設定して、#3 のセットを完全に上書きします

ステップ 4 (例では 7 行目) は、ステップ 3 (14/15 行目) の後に発生しています。

これを回避するには、コールバックを取得しnode た後に変更する必要があります。これは、必要なときに実行される独自のコールバックを使用して行うことができます。このようなもの:

var node = {};
var getNode = function(callback){
    var database = openDatabase('db', "1", "object store", 10);
    database.transaction(function(tx) {
     tx.executeSql("CREATE TABLE IF NOT EXISTS name (NodeId int, NodeName text)", [], function(tx) {
      tx.executeSql("insert into name (NodeId,NodeName) values (1,'node')",[],function(tx){
       tx.executeSql("select * from name where NodeId=1",[],function(tx,res){
         // Stringify/Parse the item so we can manipulate it in the callback
         node = JSON.parse(JSON.stringify(res.rows.item(0)));
         // Now that we've set node, let's call the callback we passed in.
         callback && callback();
       });
      });
     }, {});
    });
};
// Call get node and pass a function that will be executed
// _after_ the data is asynchronously retrieved
getNode(function(){
  node.NodeId=22;
  delete node.NodeId;
  console.log(node); // Now, node.NodeId has been deleted
});
于 2013-06-27T16:11:25.523 に答える
0

次の問題があると思います。例を見てみましょう。

見た目:

  1. データベース接続を開きます
  2. ノードオブジェクトを初期化します
  3. 非同期トランザクションを実行します
  4. フィールド NodeId をノード オブジェクトに追加します。
  5. オブジェクト フィールドを削除しようとしました。

1-2-3-4-5 のように機能すると思いますが、1-2-4-5-3 のように機能します。

PS同期コードが必要な場合は、openDatabaseSyncなどを使用してみてください。ただし、openDatabaseSyncはユーザーIOではなくワーカー(HTML5ワーカー)IOでのみ機能することに注意してください。

PSS IO === 入出力

于 2013-06-27T16:21:03.407 に答える