Функция не вызывается синхронно? - PullRequest
0 голосов
/ 31 октября 2011

У меня проблема с некоторым кодом, который не работает должным образом, я, вероятно, должен объяснить, что он делает первым:

  • При загрузке документа функция selectForLists запрашивает sqlite DB, содержащую футболрезультаты, в частности таблица с именем match, затем вызывая функцию 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>');
}

Ответы [ 2 ]

3 голосов
/ 31 октября 2011

И db.transaction, и tx.executeSql являются асинхронными функциями, точно так же как setTimeout, где, если вы напишите

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

*, 1007 * выполнится до doLater(), потому чтосозданная вами функция обратного вызова будет вызвана в будущем.

В вашем случае latestTest() вызывает db.transaction, а затем tx.executeSql, оба из которых являются асинхронными.Это означает, что функция обратного вызова latestTest2 будет вызвана в какое-то время в будущем, которая будет после , когда будет вызван loaded().

2 голосов
/ 31 октября 2011

Функция latestTest вызывает другую функцию executeSQL с собственным обратным вызовом. Этот обратный вызов будет выполнен после завершения SQL, что произойдет в произвольный момент времени.

Функция renderLists продолжит выполнение (включая вызов функции loaded) в обычном режиме, совершенно независимо от того, что связано с выполнением обратных вызовов в latestTests.

Ваша ошибка в том, что loaded будет «ждать» выполнения - у вас все еще будут отложенные обратные вызовы из кода БД в latestTest.

...