【问题标题】:Cordova SQLite Return a Promise?Cordova SQLite 返回一个承诺?
【发布时间】:2018-01-01 00:34:39
【问题描述】:

在 Angular 服务中考虑这种方法:

    select : function(table) {
        window.sqlitePlugin.openDatabase({
            name: 'smartLab.db',
            location: 'default'
        }, function success(db) {
            var defer = window.Q.defer();

            console.dir(defer);

            db.executeSql('SELECT * FROM ' + table, [], function success(rows) {
                var resp = [];

                for(var i = 0; i < rows.rows.length; i++) {
                    resp.push(rows.rows.item(i));
                }

                defer.resolve(resp);

            }, defer.reject)
        }, function error(err) {

        })
    }

我通过以下方式从另一个服务调用它:

DatabaseService.select(TBL_NAME).then(function(rows) {
  // logic goes here
});

我得到的错误是:

Uncaught TypeError: Cannot read property 'then' of undefined

我以前从未使用过 Q,但对 Promise 很熟悉,有什么东西会跳出本质上是错误的吗?显然有些东西是……

【问题讨论】:

    标签: angular cordova ionic-framework promise cordova-sqlite-storage


    【解决方案1】:

    你永远不会从延迟对象返回承诺(点击here了解更多)

    select : function(table) {
        var defer = window.Q.defer();
    
        window.sqlitePlugin.openDatabase({
            name: 'smartLab.db',
            location: 'default'
        }, function success(db) {
    
    
            console.dir(defer);
    
            db.executeSql('SELECT * FROM ' + table, [], function success(rows) {
                var resp = [];
    
                for(var i = 0; i < rows.rows.length; i++) {
                    resp.push(rows.rows.item(i));
                }
    
                defer.resolve(resp);
    
            }, defer.reject)
        }, function error(err) {
    
        });
    
        return defer.promise;
    }
    

    【讨论】:

    • 显然有些东西天生就有问题!感谢您指出这一点。
    【解决方案2】:

    由于您使用的是 ionic/angular,因此您也可以使用 Promise。例如,我使用 DataProvider 指令:

    public getJobs() {
        return new Promise((resolve, reject) => {
          this.sqlite.create({
            name: this.dbName,
            location: this.dbLoc
          })
          .then((db: SQLiteObject) => {
            var query = "SELECT * FROM user_jobs WHERE user_id=(?)";
            db.executeSql(query, [this.userId])
            .then((resp) => {
              console.log('Executed SELECT SQL:', resp.rows.length);
              resolve(resp);
            })
            .catch(e => console.log('db.executeSql error: ', JSON.stringify(e)));
    
          })
          .catch(e => console.log('sqlite.create error: ', e));
    
          });
      }
    

    在任何页面你都可以轻松调用它:

    this.dataProvider.getJobs().then((resp:any) => {
            if (resp.rows.length > 0) {
              for (var i = 0; i < resp.rows.length; i++) {
                let item = resp.rows.item(i);
                console.log(item);
              }
            }
          });
    

    【讨论】:

      猜你喜欢
      • 2015-11-27
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      相关资源
      最近更新 更多