2016-10-31 2 views
0

Я хочу получить обратный вызов успешной транзакции SQLite с Ionic 2. Я все еще изучаю обещание HTML5, и это все еще немного запутанно. И поскольку я ранее использовал jQuery Deferred, я пытаюсь адаптировать то, что я использовал с jQuery.ionic 2 SQLite управлять обратным вызовом с Promise

Перед ионического 2, я использовал следующий шаблон Jquery выполнить мою асинхронную SQL:

var SqlResult = function(sqlToExecute,bracketValues){ 
    this.sqlToExecute = sqlToExecute; 
    this.bracketValues =bracketValues; 
}; 

SqlResult.prototype.execSqlCustomDeferred = function(){ 
     var execSqlCustomDeferredRes = $.Deferred(); 
     var execSqlCustomDeferredResProm = execSqlCustomDeferredRes.promise(); 

     var sqlToExecuteForTx = this.sqlToExecute; 
     var bracketValuesForTx = this.bracketValues; 

     DbManagement.db.transaction(function(tx){ 
      tx.executeSql(sqlToExecuteForTx,bracketValuesForTx,success,error); 
      function success(tx,rs){ 
        execSqlCustomDeferredRes.resolve(rs); 
      } 
      function error(tx,error){ 
       execSqlCustomDeferredRes.reject(error); 
      } 
     }); 
     return execSqlCustomDeferredResProm; 
}; 

С этим рисунком я получал результат асинхронного, с SqlResult.prototype.execSqlCustomDeferred.done(function(res){...}).

Теперь я изо всех сил, чтобы выяснить, как все должно быть предписано использовать шаблон Promise, я думал о следующем, но она не соответствует:

Этот случай не будет работать, потому что resolve() или reject() не существуют (он не переносит).

private execSqlCustom = (sqlToExecute:string,bracketValues:Array<any>) => { 
    let sqlToExecuteForTx:string = sqlToExecute; 
    let bracketValueForTx:Array<any> = bracketValues; 

    return this.db.transaction(
     function(tx){ 
      tx.executeSql(sqlToExecuteForTx,bracketValueForTx,success,error); 
      function success(tx,rs){ 
       resolve(rs);      
      } 
      function error(tx,error){ 
       console.log('execSqlCustom error ' + error.message); 
       reject(error); 
      } 
     } 
    ); 

Это не будет работать ни, потому что я думаю, что я потеряю контекст (это) (это transpiles, но при исполнении он говорит мне, что:

он не может читать дб неопределенной

):

private execSqlCustom = (sqlToExecute:string,bracketValues:Array<any>) => { 
    let sqlToExecuteForTx:string = sqlToExecute; 
    let bracketValueForTx:Array<any> = bracketValues; 
    return new Promise(function(resolve,reject){ 
     this.db.transaction(
     function(tx){ 
      tx.executeSql(sqlToExecuteForTx,bracketValueForTx,resolve,reject); 
     } 
    ); 

кто-нибудь определить, что я делаю неправильно?

ответ

0

Я обнаружил, что в конце функции можно было бы добавить .bind(this) в функции, существующую в этом контексте.

Создав new Promise() и добавление .bind(this) в конце function(resolve,reject){} внутри нее, она работала и я могу использовать .then((...) => {...} на результат асинхронной вернулся.

Моя функция выглядит следующим образом:

private execSqlCustom = (sqlToExecute:string,bracketValues:Array<any>):Promise<any> => { 

    return new Promise(function(resolve,reject){ 
     this.db.transaction(
     function(tx){ 
      tx.executeSql(sqlToExecute,bracketValues,success,error); 
      function success(tx,rs){ 
       resolve(rs);      
      } 
      function error(tx,error){ 
       console.log('execSqlCustom error ' + error.message); 
       reject(error); 
      } 
     } 
     )}.bind(this) 
    ); 
} 
Смежные вопросы