Как дождаться завершения cordova.plugins.sqlitePorter.exportDbToSql, прежде чем продолжить? - PullRequest
0 голосов
/ 29 октября 2019

С помощью плагина SQLite Porter Cordova / Phonegap я пытаюсь создать файл резервной копии базы данных приложения, прежде чем продолжить выполнение кода.

Однако я не могу этого сделать, поскольку онасинхронный и независимо от того, что я пробую, он всегда завершается до того, как выполняется функция successFn, ​​хотя successFn является своего рода обратным вызовом.

Я уже пробовал использовать посылки, ожидание / асинхронность безрезультатно. Моя последняя попытка была использовать обещание, как показано в примере ниже.

var successFn = function (sql, count) {
               console.log("Success")
            };
var promise = new Promise(function (resolve, reject) {
    cordova.plugins.sqlitePorter.exportDbToSql(db, {
         successFn: successFn
    })
});
promise.then(
    function () { return true; },
    function (erro) { return false;}
);
console.log("END");

Я ожидал, что порядок записи в журнале будет «Успешно», затем «Конец», но он вернет «Конец», затем «Успех».

1 Ответ

0 голосов
/ 29 октября 2019

Обновление

Поскольку вы используете Ionic 1, вы можете заключить функцию в обещание и использовать ее:

function exportDbToSql() {
  var deferred = $q.defer();
  cordova.plugins.sqlitePorter.exportDbToSql(db, {
    successFn: function(sql, count) { 
      deferred.resolve({sql: sql, count: count}) 
    }
  });
  return deferred.promise;
}

И когда вы вызываетефункция, это будет:

exportDbToSql().then(function(result) {
  console.log(result.sql);
  console.log(result.count);    
});

Старый ответ

Если вы используете Ionic 2+, то вы можете следовать их документации здесь.

Откройте командную строку и введите

ionic cordova plugin add uk.co.workingedge.cordova.plugin.sqliteporter
npm install @ionic-native/sqlite-porter

, затем вы можете использовать ее следующим образом:

import { SQLitePorter } from '@ionic-native/sqlite-porter/ngx';


constructor(private sqlitePorter: SQLitePorter) { }

...

let db = window.openDatabase('Test', '1.0', 'TestDB', 1 * 1024);
// or we can use SQLite plugin
// we will assume that we injected SQLite into this component as sqlite
this.sqlite.create({
  name: 'data.db',
  location: 'default'
})
  .then((db: any) => {
    let dbInstance = db._objectInstance;
    // we can pass db._objectInstance as the database option in all SQLitePorter methods
  });


let sql = 'CREATE TABLE Artist ([Id] PRIMARY KEY, [Title]);' +
           'INSERT INTO Artist(Id,Title) VALUES ("1","Fred");';

this.sqlitePorter.importSqlToDb(db, sql)
  .then(() => console.log('Imported'))
  .catch(e => console.error(e));

В вашем случае это должно работатькак это:

this.sqlitePorter.exportDbToSql(db)
  .then(() => console.log('success'))
  .catch(() => console.log('error'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...