queryDB が非同期の場合、(特に jQuery を使用している場合) queryDB と getPerson (コードを変更して) が「promise」タイプのオブジェクトを返すことをお勧めします。その約束から、成功/失敗/完了タイプのコールバックをさらにアタッチして、処理を続行できます。jQuery では、次のように,を使用してdone
、これらのコールバックを行うことができます。fail
always
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
})
など。そうすれば、事後までコールバックを渡す必要がありません。とてもかっこいい。