2013-02-10 1 views
6

고려 :WebSQL 쿼리를 동기식으로 만드는 방법은 무엇입니까?

var globalvar; 

function viewyearmain() { 
    db.transaction(function (tx) 
    { 
    tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], function (tx, results) 
    { 
     var len = results.rows.length; 
     msg = len; 
     globalvar = msg; 
    }, null); 

    }); 

    if (globalvar>0) 
    { 
    alert("ROWS FOUND"); 
    } 
    else 
    { 
    alert("ROWS NOT FOUND"); 
    } 
} 

문제는 트랜잭션이 if 문에 도달 할 때까지 완료되지 않았기 때문에 ROWS NOT FOUND가 나타날 것입니다.

답변

5

비동기 콜백은 원하는 정도에 관계없이 동기식이 아닙니다. 두 번째 기능으로 이동하고, 콜백에서 것을 전화, 또는

var globalvar; 

function viewyearmain() { 
    db.transaction(function (tx) 
    { 
    tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], function (tx, results) 
    { 
     var len = results.rows.length; 
     msg = len; 
     globalvar = msg; 
     if (globalvar>0) 
     { 
     alert("ROWS FOUND"); 
     } 
     else 
     { 
     alert("ROWS NOT FOUND"); 
     } 
    }, null); 

    }); 
} 

:

그냥 모든 (가) 콜백으로 결과에 따라 코드를 이동합니다.

+0

@ 마이클 질문을하려면 "질문하기"버튼을 사용하십시오. –

0

제 생각에 WebSQL은 동기 SQL 문을 지원하지 않습니다. 이것은 SQL 처리로 사용자 인터페이스를 중단 시키거나 동결시키지 않기 때문에 대개 좋은 일입니다. 따라서 CL.의 대답은 결과를 쿼리로 처리하는 데 적합한 비동기 메커니즘을 제공합니다.

그러나 동기식 SQL 쿼리를 원한다면 WebSQL 대안 인 SequelSphere - An HTML5/JavaScript SQL Relational Database을 확인하십시오.

100 % 자바 스크립트이므로 모든 브라우저 및 플랫폼에서 실행됩니다. 또한 IndexedDB 또는 LocalStorage에 데이터를 저장합니다. 또한 JSON 통합, 변경 추적기, 사용자 정의 SQL 함수, SYNCHRONOUS SQL 처리 등 WebSQL이 제공하지 않는 많은 종소리와 휘파람을 포함합니다. WebSQL 표준이 사용되지 않으므로이 방법이 훌륭한 대안이라고 생각합니다.

전체 공개 : 나는 WebSQL을 좋아하지만 SequelSphere와 결혼했다.

+0

정보를 제공해 주셔서 감사합니다 ... 이미 CL의 아이디어와 그 작업에 따라 코드를 수정했습니다 ..하지만 게시물도 검토 할 것입니다. @ John Fowler에게 감사드립니다. – user2058890

+0

@ John Fowler SequelSphere를 알고 싶습니다. 오프라인 지원 여부는 무엇입니까? –

+0

@Kanna SequelSphere는 오프라인 (앱 캐시 매니페스트 파일 사용)을 지원합니다. 그것은 그것의 데이터를 IndexedDB 또는 LocalStorage에 저장합니다 (브라우저가 지원하는 순서대로). –

0

지금은 조금 늦었지만 가치있는 것은 ... 호출을 동기식으로 만들 수는 없지만 Async과 같은 라이브러리를 사용하면 코드를 단순화 할 수 있습니다. 과잉으로 보일지도 모르지만, 3 또는 4 문장을 연속적으로 수행해야한다면 코드를 훨씬 쉽게 읽을 수 있습니다.

async.waterfall([ 
    function(callback){ 
     db.transaction(function (tx) { 
      tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], 
       function (tx, results) { 
        var len = results.rows.length; 
        callback(null, len) 
       }, 
       function(){ 
        callback("An error occurred when reading data"); 
       } 
      }); 
     }); 
    }, 
    function(len, callback){ 
     // Now do something with the length. 
     console.log("The length is: " + len); 
    } 
]); 
0

저는 2 년이 지났지 만 질문에 직접적으로 대답하지 않았다고 생각하여 두 개의 센트를 던져 넣을 생각이었습니다.

먼저이 기사를 읽는다면 WebSQL을 사용해서는 안됩니다. deprecated이 IndexedDB를 사용했으며이 시점에서 W3C 표준 트랙의 유일한 데이터베이스입니다.

WebSQL을 사용하려는 의도가 무엇이든 관계없이 비동기 API (일부는 John Fowler의 답변에 언급되어 있음)가 제공하는 이점없이 살 수 있다면 그 사양도 알아야합니다. synchronous API을 정의합니다.

그렇습니다. 개발중인 브라우저가 동기 API를 구현했다면 WebSQL에서 명령문을 동 기적으로 실행할 수있는 방법이 있습니다.

동기식 인터페이스처럼 단순한 비동기식 인터페이스를 다루는 데 신경 쓰지 않는다면 BakedGoods을 확인하십시오.일부 저장 설비 별 구성에 대한 지원의 부족의 비용으로 제공

bakedGoods.getAll({ 
    filter: "valueObj.holdingType === 'month'", 
    storageTypes: ["webSQL"], 

    //Contains database configuration data and operation preferences 
    options: optionsObj, 

    complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){} 
}); 

그것의 간단한 인터페이스와 타의 추종을 불허하는 저장 시설 지원 : 그것으로

, 당신의 쿼리를 실행하는 것처럼 간단합니다. 예를 들어 다중 컬럼 기본 키가있는 WebSQL 테이블에서 저장 영역 조작을 지원하지 않습니다.

이러한 유형의 기능을 많이 사용하는 경우 다른 곳을 찾아 볼 수 있습니다.

아, 완벽한 투명성을 위해 BakedGoods가 귀하의 것으로 진정 유지됩니다. :)