1

オブジェクトのメソッド内にある関数から値を返すのに問題があります。どうすればこれを行うことができますか?コードで説明しましょう。

function ObjPerson() {

    this.getPerson = function() {

         function queryDB() {
             //run query and pass result data to success or error functions
         }

         function success(data) {
             //process data 
             return data;  
         }

         function error(errorData) {
           //process error
         }

         queryDB();
    }
  }

 var person = new ObjPerson;
 var userData = ObjPerson.getPerson();

問題は、getPerson() メソッドから何も返されないことです。これを行う最良の方法は何ですか?

ありがとう!

4

4 に答える 4

4

これが同期関数の場合は値を返します

function ObjPerson() {

    this.getPerson = function() {

        function queryDB() {
            //run query and pass result data to success or error functions
        }

        function success(data) {
            //process data 
            return data;  
        }

        function error(errorData) {
          //process error
        }

        return queryDB(); // HERE'S THE CHANGE
   }
 }

var person = new ObjPerson(); // always use parentheses
var userData = person.getPerson(); // ERROR: getPerson is instance function

ただし、この関数が非同期の場合は、少し異なる方法で行う必要があります。残念ながら、次のように呼び出すことはできません。

var userData = person.getPerson();

割り当てが行われるまでに、非同期呼び出しはまだ返されない可能性があるためです...したがってuserData、非同期呼び出しの後に割り当てを割り当てる必要があります。(使用している非同期ライブラリを教えてください)

あなたの例の他のコードの匂い

しかし、あなたのコードには他の匂いもあります。内部の functionsqueryDBとfunctions はクロージャ内で定義されてsuccessおりerror、読みやすくするために、ローカル スコープ変数として定義する必要があります。

var success = function (data) {
    // process data
    return data;
}
于 2012-08-02T14:23:27.540 に答える
1

phonegap を使用したことはありませんが、そのドキュメントに基づいています。

SQLTransaction の executeSql メソッドが呼び出されると、そのコールバックが SQLResultSet で呼び出されます。

おそらく使用する executeSql は非同期です。つまり、たとえば、次の代わりに変更する必要があります。

 var person = new ObjPerson;
 var userData = ObjPerson.getPerson();
 // something here using userData

必ず:

function ObjPerson() {

    this.getPerson = function(requestSuccesfullCallback) {

         function queryDB() {
             //run query and pass result data to success or error functions
         }

         function success(data) {
             //process data 
             requestSuccesfullCallback(data);  
         }

         function error(errorData) {
           //process error
         }

         queryDB();
    }
  }

 function callback(userData)
 {
      // something here using userData
 }

 var person = new ObjPerson;
 ObjPerson.getPerson(callback);
于 2012-08-02T14:38:50.647 に答える
1

queryDB が非同期の場合、(特に jQuery を使用している場合) queryDB と getPerson (コードを変更して) が「promise」タイプのオブジェクトを返すことをお勧めします。その約束から、成功/失敗/完了タイプのコールバックをさらにアタッチして、処理を続行できます。jQuery では、次のように,を使用してdone、これらのコールバックを行うことができます。failalways

   var person = new ObjPerson;
   var userDataPromise = ObjPerson.getPerson();
   userDataPromise.done(function(person){
      //deal with person object here
      //
   }).fail(function(errorobj){
      //deal with error
   }).always(function(){
      //deal with completion
   });

ここで、jQuery ライブラリを使用していた場合は、ajax 呼び出しで返された promise を返すことができます。それは私がアドバイスすることではありません。おそらく、あなたの をどのようpersonに呼び出すかについて、いくつかの厳しい要件があります。さらに、コードの他の部分に、あなたが ajax や localDB などを実行していることを知ってもらう必要はありませんperson....

そのため、これを行うためにコードを完成させる方法についての大まかなスケッチを次に示します。

function ObjPerson() {
    function getData (args,success,fail){
        //somehow get your data.  We'll assume it doesn't return promises
    } 
    this.getPersonPromise = function() {
        var returnedPromise = $.Deferred();

        getData(args,function(data){
           //success callback
           //process data (assume PersonCustomData is defined elsewhere)
           var person = new PersonCustomData (data)
           returnedPromise.resolve(person);
        }, function(error) {
           //failure callback, return custom errors, or maybe 
           //just return original error if lazy or don't quite know all methods
           //of failure or something.
           var errorObj = ...
           returnedPromise.reject(errorObj);

        });
        return returnedPromise;

    }
  }

 var person = new ObjPerson;
 var promise = ObjPerson.getPersonPromise();
 person.done(function(person){
    //do more stuff with PersonCustomData instance
 }).fail(function(errorObj){
    //oops
 })

など。そうすれば、事後までコールバックを渡す必要がありません。とてもかっこいい。

于 2012-08-02T15:02:21.997 に答える
1

関数 getPerson は何も返さないreturnため、値を割り当てるために使用する必要があります (return dataの値を返すことに注意してくださいfunction success) 。

于 2012-08-02T14:23:09.160 に答える