2016-12-19 17 views
0

メソッド内のネストされた関数から値(真または偽)を取得しようとしましたが、値はUNDEFINEDを返します。オブジェクトネストされた関数からどのように値を取得できますか?Javascript:メソッド内の関数から値を取得する方法

var result = { 

     compute: function() { 
      this.retorno = result.transaction(); 
     }, 

     transaction: function() { 

      var db = window.sqlitePlugin.openDatabase({name: 'database.db', location: 'default'}); 

      db.transaction(checaFR,erroFR); //Check if (F)irst (R)un.         

      function checaFR(tx){   //Check if table exists 
       tx.executeSql('SELECT * FROM setup',[],checaFRSuccess,erroFR2); 
       alert("Select Query OK"); 

      } 

      function erroFR(err){   //Return if error 
       alert('Ops - '+err); 
       return false;    //This value I Need! :(
      } 

      function checaFRSuccess(tx,result){ 
       alert("Query Sucess "+result.rows.length); 
       return ('Rows: '+result.rows.length); 
      } 

      function erroFR2(err2) {  //If no DB table 

       alert("erroFR2: "+JSON.stringify(err2)); 
       db.transaction(populateDB, errorCB, successCB); //Start DB Populate 
      } 

      function populateDB(tx) { 
       tx.executeSql('CREATE TABLE IF NOT EXISTS setup (id INTEGER PRIMARY KEY AUTOINCREMENT, runned TEXT NOT NULL)'); 
       tx.executeSql('INSERT INTO setup(runned) VALUES ("1")'); 
      } 

      function errorCB(errCB) { 
       alert("Error processing SQL: "+errCB); 
       return false;     //This value I Need! :(
      } 

      function successCB() { 
       alert("successCB OK"); 
       return true;     //This value I Need! :(
      } 

     } 
    }; 
    result.compute();       //Start the main function 

return { 
    retorno: "var: "+result.retorno  //This returns UNDEFINED 
    }; 

この関数からどのように値を取得して渡すことができますか?

注:データベースの作成を含め、すべてのコールバックとアラートが機能しています。 :D

+0

質問のコードを[mcve]に減らして、必要な値とそれを取得しようとした方法の明確な単一の例を追加してください。 –

答えて

1

次のコードを使用して、内部にネストされた関数を参照できます。あなたは公にアクセスできるようにする必要があり、内部関数からオブジェクトを返す必要が前

result.transaction().erroFR(); 
result.transaction().errorCB(); 

しかし。これは基本的にモジュールパターンで、関連する情報だけを外部に公開することができます。したがって、以下のように関数を公開する必要があります。オブジェクトを返す関数の最後のreturn文に注意してください。

var result = { 

     compute: function() { 
      this.retorno = result.transaction(); 
     }, 

     transaction: function() { 

      var db = window.sqlitePlugin.openDatabase({name: 'database.db', location: 'default'}); 

      db.transaction(checaFR,erroFR); //Check if (F)irst (R)un.         

      function checaFR(tx){   //Check if table exists 
       tx.executeSql('SELECT * FROM setup',[],checaFRSuccess,erroFR2); 
       alert("Select Query OK"); 

      } 

      function erroFR(err){   //Return if error 
       alert('Ops - '+err); 
       return false;    //This value I Need! :(
      } 

      function checaFRSuccess(tx,result){ 
       alert("Query Sucess "+result.rows.length); 
       return ('Rows: '+result.rows.length); 
      } 

      function erroFR2(err2) {  //If no DB table 

       alert("erroFR2: "+JSON.stringify(err2)); 
       db.transaction(populateDB, errorCB, successCB); //Start DB Populate 
      } 

      function populateDB(tx) { 
       tx.executeSql('CREATE TABLE IF NOT EXISTS setup (id INTEGER PRIMARY KEY AUTOINCREMENT, runned TEXT NOT NULL)'); 
       tx.executeSql('INSERT INTO setup(runned) VALUES ("1")'); 
      } 

      function errorCB(errCB) { 
       alert("Error processing SQL: "+errCB); 
       return false;     //This value I Need! :(
      } 

      function successCB() { 
       alert("successCB OK"); 
       return true;     //This value I Need! :(
      } 

      // Return an object containing functions which needs to be exposed publicly 
      return { 
       checaFR : checaFR, 
       erroFR : erroFR, 
       checaFRSuccess : checaFRSuccess, 
       erroFR2 : erroFR2, 
       populateDB : populateDB, 
       errorCB : errorCB, 
       successCB : successCB 
      } 

     } 
    }; 
0

あなたはresult.transactionメソッドにコールバック関数を渡す必要があり、かつfalse値は、そのコールバック関数に渡されます。

これはbc falseが非同期メソッドであるdb.transactionの間に派生した後に導き出されます。したがって、falseも非同期的に渡す必要があります。

関連する問題