2017-01-03 1 views
0

Я борюсь с ошибкой с помощью Phonegap/Cordova. Я строй и тестирование моего приложения в подключенном устройстве, а это ошибка, я получаю:Проблемные обещания в телефонном ключе, используя webSQL (SQLite)

INVALID_STATE_ERR: DOM Exception 11

Ни одно из решений, которые я нашел работу. Большинство из них направлены на использование ajax, чего здесь нет. Я нашел еще один вопрос о телефонном разговоре, в котором они говорят, что это может быть из-за того, что устройство не готово, но я проверил, что устройство готово в моем случае.

Это код, в котором генерируется ошибка (я использую Promise polyfill BTW, так как оно не поддерживается в Кордове до сих пор):

/** 
* Clients insertion 
* @param tx 
* @param clientes 
* @return {Promise} 
*/ 
clientes = function(clientes) { 

    return new Promise(function(resolve, reject) { 
     var clientesCount = clientes.length; 

     if (clientesCont === 0){ 
      resolve(); 
     } 
     else { 
      APP.db.transaction(function(tx) { 
       $.each(clientes, function(i, cliente) { 

        var idclienteLocal; 

        // Current client 
        tx.executeSql("INSERT OR REPLACE INTO clientes (id, name, ...) " + 
         "VALUES " + 
         "(?,?,...)", 
         [cliente.id, cliente.name], 
         function(tx, res) { 

          clientesCount--; 

          idclienteLocal = res.insertId; 

          // Clien phones 
          telefonosCliente(tx, cliente, idclienteLocal).then(function() { 
           // Client credits 
           creditosCliente(tx, cliente, idclienteLocal).then(function() { 
            if (clientesCount === 0) { 
             resolve(); 
            } 
           }).catch(function(error) { 
            reject('Error créditos cliente ' + cliente.empresa + ': ' + error); 
           }); 
          }).catch(function(error) { 
           reject('Error teléfonos cliente ' + cliente.empresa + ': ' + error); 
          }); 

         }, function(tx, error) { 
          reject(error.message); 
         }); 

       }); 
      }); 
     } 
    }); 
} 

Я подозреваю, что это, возможно, придется что-то делать с цикл (я использую jQuery для этого), поэтому я попытался выполнить очередность каждой итерации, когда предыдущая была полностью решена с помощью рекурсивной функции, но она даже не работает в браузере (Promise в первом procesarCliente(), внутри clientes() не будет разрешено). Вот измененный код:

/** 
* Recursive function to process each client one after the other 
* @param tx 
* @param clientes 
* @param cliente 
* @return {Promise} 
*/ 
procesarCliente = function(tx, clientes, cliente) { 
    return new Promise(function(resolve, reject) { 
     // Current client 
     tx.executeSql("INSERT OR REPLACE INTO clientes (id, name, ...) " + 
      "VALUES " + 
      "(?,?,...)", 
      [cliente.id, cliente.name,...], 
      function(tx, res) { 
       var idclienteLocal = res.insertId; 

       // Client phones 
       telefonosCliente(tx, cliente, idclienteLocal).then(function() { 
        // Client credits 
        creditosCliente(tx, cliente, idclienteLocal).then(function() {       
         if (clientes.length === 0) { 
          resolve(); 
         } 
         else { 
          procesarCliente(tx, clientes, clientes.shift()); 
         } 
        }).catch(function(error) { 
         reject('Error créditos cliente ' + cliente.empresa + ': ' + error); 
        }); 
       }).catch(function(error) { 
        reject('Error teléfonos cliente ' + cliente.empresa + ': ' + error); 
       }); 

      }, function(tx, error) { 
       reject(error.message); 
      }); 
    }); 
}, 
/** 
* Clients insertion 
* @param tx 
* @param clientes 
* @return {Promise} 
*/ 
clientes = function(clientes) { 

    return new Promise(function(resolve, reject) { 
     var cliente, 
      clientesCont = clientes.length; 

     if (clientesCont === 0){ 
      resolve(); 
     } 
     else { 
      APP.db.transaction(function(tx) { 
       cliente = clientes.shift(); 
       procesarCliente(tx, clientes, cliente).then(function() { 
        resolve(); 
       }).catch(function(error) { 
        reject(error); 
       }); 
      }); 
     } 
    }); 
} 

Любая помощь по фиксации второго подхода, и самое главное, как заставить его работать в PhoneGap?

EDIT

Я добавил код инспектировать каждый из таблиц в локальной БД, и удивительно, что apparenntly создает только две таблицы, называемую «неопределенный» и «пунктом» (I Ждет» t даже использовать такую ​​таблицу).

Проверочный код здесь:

if (APP.DEBUG) { // this is true 
     // Verify inserted data when triggered event 'app.load.all' just after the very last item in the DB has been inserted 
     $wrapper.on('app.load.all', function() { 
      APP.db.transaction(function(tx) { 
       console.log('Verifying DB'); 
       tx.executeSql("SELECT name FROM sqlite_master WHERE type='table'", [], 
        function(tx, res) { 
         if (res.rows.length) { 
          $.each(res.rows, function(i, tabla) { 
           if (tabla.name !== '__WebKitDatabaseInfoTable__') { 
            console.log('Verifying table ' + tabla.name); 
            tx.executeSql("SELECT * FROM " + tabla.name, [], 
             function(tx, res) { 
              console.log("Table " + tabla.name + " has " + res.rows.length + " records"); 

             }, 
             function(tx, error) { 
              console.log('Error verifying table ' + tabla.name + ':' + error.message); 
             }); 
           } 
          }); 
         } 
        }, function(tx, error) { 
         console.log('Error verifying DB tables: ' + error.message); 
        }); 
      }); 
     }); 
    } 

В результате этих строк, отфильтрованных "Web Console":

I/Web Console(14391): Verifying DB:1085 
I/Web Console(14391): Verifying table undefined:1091 
I/Web Console(14391): Verifying table item:1091 
I/Web Console(14391): Error Verifying table undefined:no such table: undefined:1100 
I/Web Console(14391): Error Verifying table item:no such table: item:1100 

который совершенно странно для меня

ответ

0

я, наконец, нашел проблему :

Я могу рассматривать объект SQLResult в браузере как массив, но это не работает внутри сборки phonegap (возможно, из-за браузера Android WebView). Поэтому на самом деле запись не была вставлена.

я должен был избавиться от петель требуется JQuery (они не получают каждый пункт в приложении PhoneGap), а также использовать для цикла вместо этого, и в конечном итоге использовать пункт() метод SQLResult объект:

ПЛОХО:

$.each(res.rows, function(i, item) { 
    //... 
} 

ХОРОШО:

var item; 
for (var i = 0; i < res.rows.length; i++) { 
    item = res.rows.item(i); 
} 
Смежные вопросы