我一直在阅读有关Javascript类/对象/原型的内容,并且来自OOP背景,因此我现在希望在Javascript中使用对象。
但我认为我误解了一些事情。例如,在VB.net中使用过去的对象时,您创建了对象并能够使用数据类填充它。
但是在javascript的土地上,由于这种异步的事情,事情不会以我期望的方式执行。
所以我按照下面创建我的原型并调用相应的函数,但函数说它已经完成了(但是因为它没有得到来自$ .post的响应,我的代码继续作为空值而我不得到我想要的信息。
<!DOCTYPE html>
<html>
<body>
<button onclick="gogetperson()">Hello</button>
<p id="demo"></p>
<script>
function Person() {
this.firstName = '-';
this.surname= '-';
this.alias = 0;
}
Person.prototype.name = function() {
return this.firstName + " " + this.surname
};
Person.prototype.getPerson = function(personid)
{
var query = $.param({personid: personid});
var url = 'custom/person_get.php';
$.post(url, query, function (response) {
var obj = $.parseJSON(response);
this.firstname= obj['rFirstName'];
this.surname = obj['rLastName'];
this.alias = obj['rAlias'];
console.log(this.firstname);
});
}
function gogetperson()
{
var myPerson = new Person();
myPerson.getPerson(1)
console.log(myPerson.firstName);
}
</script>
<script src="plugins/jQuery/jQuery-2.1.4.min.js"></script>
</body>
</html>
因此,当我的按钮运行gogetperson函数时,它完成但尚未获得数据。 $ .post部分中的console.log向我的人的名字返回控制台,但我来不及使用它。
我是否以错误的方式使用原型?
我希望能够在获取数据时使用javascript作为对象。
或者我完全错了。
我想以这种方式使用它的理由是它似乎是比php对象更好的选择。
我应该使用PHP对象吗?
我最终希望从mysql数据库中获取数据,并使用jquery和javascript轻松更改我的网页。
答案 0 :(得分:2)
您缺少一件事,即使用$.post
的http调用是异步的,并且它不是阻塞调用。为了从getPerson()
方法获取值,您必须在该函数中传递callback ( or function)
以获得结果,但这不是推荐的方法。你可以阅读有关承诺并使用它们因为它们很棒。
但是,使用回调,您可以执行类似的操作。
Person.prototype.getPerson = function(personid, cb)
{
var query = $.param({personid: personid});
var url = 'custom/person_get.php';
$.post(url, query, function (response) {
var obj = $.parseJSON(response);
var person = new Person();
person.firstname= obj['rFirstName'];
person.surname = obj['rLastName'];
person.alias = obj['rAlias'];
console.log(person.firstname);
cb(person);
});
}
然后你可以称之为,
var myPerson = new Person();
function showPersonDetails(person){
console.log(person.name())
}
myPerson.getPerson(1, showPersonDetails);