Это действительно асинхронно или происходит так быстро, что это ничего не меняет? - PullRequest
2 голосов
/ 01 декабря 2011

Я пытаюсь написать способ синхронного выполнения набора запросов sqlite в среде WebDB.Я придумал то, что я считаю равносильным синхронной процедуре, но я не уверен, как это проверить.Вот что у меня есть:

var db = openDatabase("test1", "1.0", "test", 5 * 1024 * 1024);

function synchronousSql(tx, sqlStack, callback) {
    if (sqlStack.length !== 0) {
        var q = sqlStack.shift();
        console.log(+new Date() + ' ' + q);
        tx.executeSql(q, [], synchronousSql(tx, sqlStack, callback), null);
    } else {
        callback();
    }
}

var seq = [
    'drop table if exists table1',
    'drop table if exists table2',
    'drop table if exists table3',
    'drop table if exists table4',
    'drop table if exists table5',
    'create table table1(id integer, value text)',
    'create table table2(id integer, value text)',
    'create table table3(id integer, value text)',
    'create table table4(id integer, value text)',
    'create table table5(id integer, value text)',
    'drop table if exists table1',
    'drop table if exists table2',
    'drop table if exists table3',
    'drop table if exists table4',
    'drop table if exists table5'
    ];

db.transaction(function(tx) {
    synchronousSql(tx, seq, function() {
        console.log(+new Date() + ' - from synchronousSql callback');
    });
}, null, function() {
     console.log(+new Date() + ' - from transaction callback');   
});

На бумаге (я думаю) это должно работать.Глядя на это, я думаю, что мое предупреждающее сообщение появится, когда выполнено последнее утверждение, не обязательно, когда оно вернется, но я не уверен, как это исправить.Я попытался указать обратный вызов в своих аргументах для функции synchronousSql, но это означало, что мне пришлось вызывать его рекурсивно с обратным вызовом, и если я использовал пустую анонимную функцию, это, казалось, переписывало желаемый обратный вызов.

ТакЯ предполагаю два вопроса: во-первых, действительно ли это синхронно;и во-вторых, как я могу реализовать последний обратный вызов для выполнения последнего обратного вызова в стеке?

edit : обновил код до более поздней версии.Первый вопрос все еще остается, однако: это действительно синхронно?

1 Ответ

0 голосов
/ 01 декабря 2011

Вставьте alert() и setTimeout() в свой код, чтобы проверить, все ли они выполняются одновременно или разделяются.Обычно это хороший способ проверить это.Если весь код выполняется в одно и то же время (асинхронно), у вас сразу же будет 10 скрытых предупреждений, иначе вы получите одно за x мс.

На второй вопрос: просто проверьте, пуст ли стек.Вам, вероятно, придется передать третью переменную через вашу функцию.Если вы не определите переменную в глобальной области видимости, она не будет перезаписана.

...