Синхронный запрос к базе данных Web SQL

Я работаю над фрагментом JavaScript, который взаимодействует с клиентской базой данных SQLite через новое window.openDatabase (...) , database.transaction (...) и связанные API. Как известно большинству из вас, когда вы выполняете запрос таким образом, это асинхронный вызов, что обычно хорошо. Вы можете сделать вызов и обработать результаты соответствующим образом с помощью обратных вызовов.

В моей текущей ситуации я работаю над алгоритмом для клиента, который выполняет некоторую иерархию в локальной базе данных. Часть алгоритма I ' m, с которым возникают проблемы, требует начинать с некоторой строки, которая имеет ссылку на «родительский элемент» (по идентификатору), который является другой строкой выше в таблице. Я должен продолжать идти по этому дереву, пока не достигну корня.

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

    for (i in search.searchResults.resultsArray)
    {
        hierarchyArr = new Array();
        pageHierarchyArr = new Array();
        id = search.searchResults.resultsArray[i].ID;

        while (id != null && id != "")
        {
            var hierarchySql = "SELECT ID, parentID, type, content FROM content WHERE ID = " + id;

            // This is a prettied up call to database.transaction(...)
            var rs = db.getRS(hierarchySql);

            // Ideally the code below doesn't execute until rs is populated

            hierarchyArr.push(rs[0]);

            if (rs[0].type == "page")
            {
                pageHierarchyArr.push(rs[0]);

                // Do some additional work
            }

            id = rs[0].parentID;
        }
    }

Как вы можете догадаться, это не работает. иерархияArr получает сообщение "undefined", и затем скрипт вылетает, когда пытается проверить тип rs [0].

Когда я пытаюсь установить его с помощью обратного вызова ( db.getRSAndCallback (sql , callbackFunc) , который я использовал для предыдущих, не взаимозависимых запросов, просто отлично) это еще хуже: внутренний цикл взлетает как сумасшедший, потому что id не обновляется; предположительно из-за того, что цикл настолько загружает интерпретатор JavaScript, что фактически никогда не заполняет rs . В некоторых искусственных тестах, когда я вынудил внутренний цикл прерваться после нескольких итераций, все обратные вызовы начали выполняться в конце, после того, как цикл завершился.

«Стандарт» (такой, какой он есть сейчас) в http://dev.w3.org/html5/webdatabase/#synchronous-database-api , похоже, указывает на то, что существует синхронный API, но я не видел никаких признаков этого ни в каких браузерах на основе WebKit.

Кто-нибудь может предложить, как я могу: a. правильно сформулировать эти итеративные, взаимозависимые запросы, используя обратные вызовы или, b. каким-то образом заставить вызов действительно происходить синхронно или очевидно синхронно.

Заранее большое спасибо всем, кто попробует решить эту, казалось бы, непростую задачу.

Naim

PS Вот клиентская реализация db.getRS для справки:

.
.
.
getRS: function(sql)
{
    var output = [];
    db.database.transaction(function(tx)
    {
        tx.executeSql(sql, [], function(tx,rs)
        {
            for(i = 0; i < rs.rows.length; i++)
            {
                output.push(rs.rows.item(i));
            }
        },
        function(tx, error) { ... }
    )});
    return output;
},
.
.
.

13
задан JSW189 22 May 2013 в 21:55
поделиться