Requête synchrone à la base de données SQL Web

Je suis en train de travailler sur un peu de JavaScript qui interagit avec d'un côté client de base de données SQLite, via le newish window.openDatabase(...)database.transaction(...) et des interfaces Api. Comme vous le savez lorsque vous exécutez une requête de cette façon, il est un appel asynchrone, qui est en général bonne. Vous pouvez faire l'appel et de traiter les résultats de manière appropriée avec des rappels.

Dans ma situation actuelle, je travaille sur un algo pour un client qui fait de la hiérarchie de la marche dans la stockés localement de la base de données. La partie de l'algo, je vais avoir des ennuis avec la nécessite de départ à certains de ligne, qui a une référence à un "parent" (id) est une ligne plus haut dans le tableau. Je dois continuer à marcher jusqu'à cet arbre jusqu'à ce que j'arrive à la racine.

Le problème c'est que je suis à un point où je ne suis pas sûr de savoir comment utiliser un asynchrones requête de style avec un rappel de garder l'alimentation de la boucle parent id. Idéalement, j'ai pu obtenir la requête de bloc de sorte que je peux tout faire dans la boucle. Voici les éléments-clés de mon installation actuelle:

    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;
        }
    }

Comme vous pouvez l'imaginer, il ne fonctionne pas bien. hierarchyArr obtient un "undefined" poussé, puis le script se bloque lorsqu'il essaie de vérifier le type de rs[0].

Quand j'essaie de le configurer avec un rappel (db.getRSAndCallback(sql, callbackFunc)que j'ai utilisé pour les versions antérieures, les non-interdépendante des requêtes très bien), c'est pire: la boucle interne décolle comme un fou parce que l'id n'est pas mis à jour; sans doute parce que la boucle est de garder l'interpréteur JavaScript tellement occupé qu'il ne remplit effectivement rs. Dans certains artificielle de test où j'ai forcé la boucle interne de rompre après quelques itérations tous les rappels ont commencé à venir à travers tous à la fin, après la boucle terminée.

"Standard" (comme il l'est actuellement) à http://dev.w3.org/html5/webdatabase/#synchronous-database-api semble indiquer qu'il existe une API synchrones, mais je n'ai pas vu de signe sur tout les navigateurs basés sur WebKit.

Quelqu'un peut-il offrir des suggestions sur comment je pourrais soit, une. correctement formuler ces itératif, interdépendants requêtes à l'aide de rappels ou b. en quelque sorte l'appel pour effectivement se produire en mode synchrone ou apparemment manière synchrone.

Merci beaucoup d'avance pour toute personne qui prend une fissure à cette apparence délicate petit problème.

Naim

P. S. Voici le client de la mise en œuvre de db.getRS pour référence:

.
.
.
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;
},
.
.
.

source d'informationauteur Naim