0

一部のコードが期待どおりに動作しないという問題があります。最初に何をしているのかを説明する必要があります。

  • ドキュメントのロード時に、関数 selectForLists は、サッカーのスコアを含む sqlite DB、具体的には、matches と呼ばれるテーブルにクエリを実行し、関数 renderLists を呼び出します。

  • RenderLists は、プレイしているチームを、重複が削除された並べ替えられたリストに入れます。

  • 次に、このチーム リストのエントリごとに関数 latestTest が呼び出され、そのチームがプレーしているマッチ テーブルからすべての行が選択され、latestTest2 が呼び出されます。

  • LatestTest2 は、そのチームがプレーしている行の数をカウントし、挿入された div に何らかのコードを出力します。

  • すべてのチームでそれが完了したら、renderLists 関数を終了し、ロードされた関数を呼び出すために元に戻す必要があります。

上記のすべてが完了した後、ロードされた関数が呼び出されないのはなぜですか? また、より効率的なコードで同じ結果を達成するためのヒントがあれば、ぜひ教えてください。

この長い投稿についてお詫び申し上げます。多くの人がコードがひどいと感じると確信しています。関数が多すぎて、おそらくこれを行うためのより良い方法がたくさんあることは知っていますが、ユニで JavaScript を使用してから数年が経ち、苦労しています。それとsqlite。

コードは以下または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>');
}
4

2 に答える 2

3

と はどちらもdb.transactiontx.executeSql同様に非同期関数setTimeoutです。

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

doNow()作成したコールバック関数が後で呼び出されるため、 に実行されます。doLater()

あなたの場合、 をlatestTest()呼び出しdb.transactionてから を呼び出しますtx.executeSqlが、どちらも非同期です。つまり、コールバック関数latestTest2は、後で呼び出されることになりますloaded()

于 2011-10-31T16:07:38.273 に答える
2

この関数は、独自のコールバックを使用してlatestTest別の関数を呼び出します。そのコールバックは、SQLが終了したときに実行されます。これは、任意の時間に実行されます。executeSQL

関数は、実行中のコールバックに関係するものは別として、通常どおりrenderLists実行を継続します(関数の呼び出しを含む)。loadedlatestTests

あなたの間違いは、それloadedが実行されるのを「待つ」と考えていることです-あなたはまだのDBコードからの保留中のコールバックを持っていますlatestTest

于 2011-10-31T15:59:51.370 に答える