2013-06-27 2 views
0

JavaScript에서 재미있는 실수가 있습니다. 개체의 속성을 변경할 수 없습니다.

Web SQL에서 선택하면 객체가 반환되지만 속성을 변경하거나 삭제하려고하면 아무 일도 일어나지 않습니다.JavaScript의 객체 속성 변경되지 않음

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


이유는 속성을 변경할 수 없습니다 :이 예제에서는 객체 "노드"(크롬에서 작업)을 생성? 어떻게해야합니까?

+0

왜 작동하지 않는다고하니? 22를 할당하고 있으므로 22가되어야합니다. node.NodeId가 "1"이면 "22"를 할당하기 전에 디버그 했습니까? – ronnyfm

+0

예, 나는 node.NodeId가 1이고, 그 다음에'node.NodeId = 22'를하고, 22를 반환하지만,'console.log' 나'alert'에 의해 다시 검사 할 때 여전히 " 22 ". –

답변

1

코드가 비동기 적이므로 나타나는 순서대로 실행되지 않습니다. 에

  1. 설정 노드 {} : node=res.rows.item(0);executeSql의 완료 후에 실행됩니다 콜백에 있기 때문에,이 같은 그것의node.NodeId = 22;

    생각해 후 응답 node을 설정하는 것입니다

  2. executeSql
  3. 설정 node.NodeId 22 (및 node.NodeId 삭제)
  4. 은 RESP의 첫 번째 행에 executeSql # 2의에서 응답 설정 노드를 가져옵니다 온세은 덮어 # 3의가 (당신의 예에서 7 번째 라인이다) 완전히

4 단계 (당신의 14/15 선입니다) 3 단계 일어나고을 설정합니다.

주위를 둘러 보려면 뒤에 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 
}); 
+0

죄송합니다, 이전 실수는 나빴습니다. 그러나 문제는 비동기 적이 지 않습니다. 예제를 변경했지만 여전히 작동하지 않습니다. –

+0

@AlexFrost 글쎄, 당신의 업데이트 된 예제는 여전히 동일한 비동기 문제가 있습니다. 'f()'를 호출하면 함수의 콜백이 수행되기 전에 다음 줄이 _still_ 실행됩니다. 당신이해야 할 일을 알려주기 위해 대답을 업데이트 할 것입니다. – rgthree

+0

도와 주셔서 감사합니다. 당신은 좋은 예다. 그러나'node.NodeId'를 지우지는 않습니다. –

0

다음 문제가 있다고 생각하여 사례를 볼 수 있습니다.

보이는 방법 :

  1. 당신은 개방형 데이터베이스 연결
  2. 당신은 노드 객체를 초기화하기
  3. 당신은
  4. 당신은 객체에게 당신은 시도
  5. 노드에 필드 NODEID를 추가 비동기 트랜잭션을 실행 개체 필드를 삭제하는 방법

1-2-3-4-5와 같이 작동 할 것이라고 생각하지만 1-2-4-5-3과 같이 작동합니다.

P. 동기 코드가 필요하다면 openDatabaseSync 등을 사용해보십시오.하지만 openDatabaseSync는 사용자 IO가 아닌 Worker (HTML5 Worker) IO에서만 작동합니다.

P.SSO IO === 입출력

+0

죄송합니다, 이전 실수는 나빴습니다. 그러나 문제는 비동기 적이 지 않습니다. 예제를 변경했지만 여전히 작동하지 않습니다. –

관련 문제