2012-07-30 1 views
1

내 응용 프로그램에서 javascript webSQL을 사용하고 있는데 명령 실행 순서에 문제가 있습니다. 내 코드가 질서에 어떤 순서가 있든 상관없이 마지막으로 실행됩니다. 예를 들어 다음 코드 2는 1 전에 알릴 것입니다 :WebSQL과 Javascript 작업 순서

db.transaction(
     function (transaction) { 
     transaction.executeSql(
     'SELECT * FROM contacts WHERE id = ?;', 
     [id], 
     function (transaction, result) { 
      alert("1"); 
      if (result.rows.length != 0) { 
      user = result.rows.item(0).name; 
      } else {} 
     }, 
     errorHandler); 
    }); 

alert("2"); 
message = id + '%1E' + name; 

이것이 일어나는 이유는 무엇입니까?

+1

SQL 트랜잭션은 비동기 호출 인 반면,'alert ("2")'는 다음 함수 호출이며 즉시 실행됩니다. – TheZ

답변

1

경고 할 때 ("2") 트랜잭션을 완료하지 않았으므로 전달한 두 번째 기능이 호출되지 않았습니다. 그것은 success 처리기로 가정하기 때문에 트랜잭션이 성공적으로 완료된 후에 호출됩니다. 세 번째 인수는 실패한 경우에만 쿼리가 실패 할 때 실행할 코드 조각입니다.

페이지가 자바 스크립트를 실행할 수있는 충분한 콘텐츠를로드 할 때 이벤트 처리기 코드 외부의 모든 항목이 실행됩니다. 을 실행하려면 전체 페이지를로드 할 필요가 없습니다. JS만으로 충분합니다. 이 문장은 너무 가깝기 때문에 alert ("2") 문에 도달하여 실행되기 전에 트랜잭션이 완료 될 확률이 기본적으로 0입니다. 당신이 alert("2") 및 db.transaction (...) 사이에 충분한 코드가 있다면

그러나, 콜백이 경고 (2) 코드 전에 실행할 수 (A 경쟁 조건 소위에서) 가능합니다.

성공 사례 처리기의 기능에 따라 다르지만이 경우 이벤트 처리기를주의해야합니다. 페이지 DOM을 수정하면 페이지 로딩에 바인딩 된 이벤트 핸들러에서 db.transaction() 및 주변 코드를 래핑하는 것이 좋습니다.

-1

이 질문에 대한 답변이 아니지만 webSQL에 대한 경고를 제공해야한다고 생각했습니다.

2010 년 11 월 18 일부터 W3C는 Web SQL Database 권장 초안을 더 이상 사용하지 않으며 더 이상 유지 관리하지 않는다고 발표했습니다.

현재 브라우저에서 작동하는 동안, 나는 미래에 그것을 의지하지 않을 것입니다.

+0

네,하지만 Chrome과 사파리가 새로운 기능을 추가하지 않는다고 이해하면이 사실을 알게 될 것입니다. 한번 더 브라우저가 지원하면 indexedDatabase로 쉽게 전환 할 수 있습니다. – ewein

+0

웹 저장소는 어떻게됩니까? http://www.w3.org/TR/webstorage/ – Kasapo