2011-10-31 9 views
0

내가 몇 가지 코드가 예상대로 작동하지에 문제가있어, 난 아마 먼저 무엇을하고 있는지 설명해야한다 :함수가 동 기적으로 호출되지 않습니까?

문서로드 기능 selectForLists에
  • 가 SQLite는 DB를 포함하는 축구 점수를 조회하고, 특히 테이블 호출 된 함수는 renderLists 입니다.

  • RenderLists는 재생 팀을 중복 목록 이 제거 된 정렬 목록에 넣습니다.

  • 이 팀 목록의 각 항목에 대해 latestTest 함수를 호출하면 팀이 경기하고 있으며 latestTest2를 호출하는 경기 테이블에서 모든 행을 선택하는 이 호출됩니다.

  • LatestTest2는 팀이 경기중인 행 수를 계산하고 은 삽입 된 div에 일부 코드를 출력합니다.

  • 그는 그것이 나던 제외하고는로드 기능을 renderLists 기능을 완료하고 전화 에 복귀해야 모든 팀 완료하고 나는 그것이 마지막 일이 나던 때문에이 함수를 호출에 지연을 추가 할 필요가되면.

내가 위의 모든 것이 완료된 후에로드 된 함수가 호출되지 않는 이유는 무엇입니까? 또한 누군가가보다 효율적인 코드로 동일한 결과를 얻으려는 요령을 가지고 있다면 나는 그것을 매우 원합니다.

이 긴 게시물에 사과드립니다. 많은 사람들이 코드를 끔찍하게 찾을 것이라고 확신합니다. 너무 많은 기능과이를 수행하는 데 더 좋은 방법이 많이 있다는 것을 알고 있습니다.하지만 유니와 자바 스크립트로 작업 한 지 몇 년이 지났습니다. 그것과 sqlite와 고군분투. latestTest 기능은 자신의 콜백 다른 executeSQL 함수를 호출 아래 또는 http://pastebin.com/7AxXzHNB 감사

function selectForLists() { //called on (document).ready 
    db.transaction(function(tx) { 
     tx.executeSql('SELECT * FROM matches', [], renderLists); 
    }); 
} 

function renderLists(tx, rs) { 
    var playingList = new Array(); 
    for (var i = 0; i < rs.rows.length; i++) { 
     playingList.push(rs.rows.item(i)['playing']); 
    } 

    playingListSort = playingList.sort(); 
    var playingListFinal = new Array(); 

    playingListSort.forEach(function(value) { 
     if (playingListFinal.indexOf(value) == -1) { 
      playingListFinal.push(value); 
     } 
    }); 

    for (var c = 0; c < playingListFinal.length; c++) { 
     latestTest(playingListFinal[c]); 
    } 

    loaded(); //not running last in the function 
    //setTimeout(loaded,1000); 
    /////Using a delay because it doesn't run after the above has completed 
} 

function latestTest(team) { 
    db.transaction(function(tx) { 
     tx.executeSql('SELECT * FROM matches WHERE playing="' + team + '"', [], latestTest2); 
    }); 
} 

function latestTest2(tx, rs) { 
    counted = rs.rows.length; 
    var theFunction = rs.rows.item(0)['playing']; 

    $('#inserted').append('<li onclick="onToDate(\'' + theFunction + '\')"><img width="30px"  height="25px" id="popupContactClose" src="style/soccer.png"><div id="popupContactClose2">' + counted + '</div></img>' + rs.rows.item(0)['playing'] + '</li>'); 
} 
+0

이 코드가 브라우저에서 실행 중입니까? 어떻게 데이터베이스에 직접 연결하고 있습니까? –

+0

브라우저에서 다른 페이지가 localstorage에 데이터베이스를 만듭니다. – mao

+0

@MattBall 더 이상 사용되지 않는 웹 SQL API입니다. – Raynos

답변

2

에서

코드입니다. SQL이 끝나면 콜백이 실행됩니다.이 콜백은 임의의 시간에 수행됩니다.

loaded 함수는 latestTests의 콜백과 관련된 작업과는 별도로 정상적으로 실행을 계속합니다 (loaded 함수 호출 포함).

실수로 loaded이 실행될 때까지 기다릴 것이라고 생각합니다. DB 코드의 보류 콜백이 여전히 latestTest입니다.

+0

아, 설명해 주셔서 감사합니다. sql이 비즈니스를 수행 할 때 어떤 식 으로든 호출하도록 생각할 수 있습니까? – mao

+0

@mao 먼저 SQL에서 더 많은 일을하려고합니다. 그것은 정렬 및 그룹화에 능숙합니다. 모든 팀을 선택하고 자바 스크립트로 차별화 된 팀을 구성하고 새로 고친'latestTest2'에서'loaded '를 호출하면 더 많은 로직을'latestTest'에 결합 할 수 있습니다. [동기 API] (http://www.w3.org/TR/webdatabase/#synchronous-database-api)를 사용할 수 있지만, Raynos가 말하는 것은 아마도 주목할만한 가치가 있습니다. –

+0

감사합니다. 모두 의미가 있습니다. 나는 이전에 시도했는데 latestTest와 latestTest2를 같은 함수로 결합 할 수 없었다. 나는 어떤 일이 일어나는지 알기 위해 좀 더 시험해 볼 것이다. – mao

3

모두 db.transactiontx.executeSql는 사용자가 만든 콜백 기능을 미래의 어느 시점에 호출되는 것이기 때문에

setTimeout(function(){ 
    doLater(); 
}, 1000) 
doNow(); 

doNow()doLater() 전에 를 실행합니다 작성하는 경우 setTimeout처럼, 비동기 함수입니다.

latestTest()db.transaction을 호출 한 다음 tx.executeSql을 호출합니다. 둘 다 비동기입니다. 즉, 콜백 함수는 이후 이후에 호출되며 loaded()이 호출 될 것입니다.

+0

그렇다. 데이터베이스/SQL 함수가 비동기 였다는 것을 알지 못했다. 필자가 호출 할 함수가 얼마나 오래 걸릴지 정확히 알지 못하기 때문에로드 된 함수에서 시간 지연을 사용하지 않으려했습니다. 데이터베이스/SQL 함수가 완료된 후에로드 할 호출 할 수있는 이벤트가 있습니까? – mao

관련 문제