如果 queryDB 是异步的,那么对于 queryDB 和 getPerson(修改您的代码)返回“promise”类型对象是一个很好的建议(尤其是如果您使用 jQuery)。从该承诺中,您可以附加更多成功/失败/已完成类型的回调以继续处理。在 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 调用中返回的承诺。那不是我要建议的。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
})
等等。这样你就不必在事后传递回调。很酷。