2016-10-31 13 views
0

Ionic 2で成功したSQLiteトランザクションのコールバックを取得したいと考えています。私はまだ現在HTML5 Promiseを学習していますが、まだ少し混乱しています。以前はjQuery Deferredを頻繁に使用していたので、以前はjQueryを使っていたものに適応しようとしています。私はSqlResult.prototype.execSqlCustomDeferred.done(function(res){...})で、非同期結果を得ていたというパターンではionic 2 Promiseでコールバックを管理するSQLite

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; 
}; 

:イオン2前

は、私は私の非同期SQLを実行するには、次のjQueryのパターンを使用していました。

は今、私は次を考え、物事は約束パターンを使用するように命じすべきかを理解するために苦労したが、それは一致しません: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()を作成し、その中にfunction(resolve,reject){}の終わりに.bind(this)を追加することにより

は、それが働いたと私は、返された非同期結果に.then((...) => {...}を使用することができます。

My機能は以下のようになります。

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) 
    ); 
} 
関連する問題