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

您的代码是异步的,因此它不会按照出现的顺序执行。因为node=res.rows.item(0);在你的 s 完成后运行的回调中executeSql,它设置为等之后node的响应。 node.NodeId = 22;

可以这样想:

  1. 将节点设置为 {}
  2. 执行Sql
  3. 将 node.NodeId 设置为 22(并删除 node.NodeId)
  4. 从 #2 的 executeSql 获取响应并将节点设置为响应的第一行,完全覆盖 #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 只在 Worker(HTML5 Worker)IO 中起作用,而不是在用户 IO 中;

PSS IO === 输入/输出

于 2013-06-27T16:21:03.407 回答