1

在角服務考慮這種方法:Cordova SQLite返回Promise?

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但是很熟悉承諾,任何東西都是跳出來的本質錯誤?顯然,事情是......

回答

2

你永遠從延遲執行對象返回的承諾(點擊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; 
} 
+0

顯然是東西本身錯了!謝謝你指出。 –

0

由於您使用的離子/角度,你也可以使用一個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); 
      } 
     } 
     });