我在下面有这段代码。
var user = new user();
function user() {
// returns true if the account is password protected
function isPasswordProtected(data, callback) {
//check if the account is a password protected account, and if so request the password.
$.post('user_functions/ifpasswordprot.php', {uid: data['uid']}, function(data) { return callback(data);});
}
// function that returns 1 if the user is password protected
this.getPPStatus = function() { return isPasswordProtected({uid: this.userid}, function(data) { return data; }); };
}
这旨在创建一个用户对象的商店,可以从该网站的其他地方引用该对象。除此之外还有更多内容,但这是与此相关的代码。
在另一个页面中,我试图找出登录的用户是否使用密码保护了他们的帐户,如下所示:
alert(user.getPPStatus());
然而,这总是以undefined
形式出现。
我不是JavaScript中的对象专家,也不是匿名函数用户的专家。任何人都可以解释为什么这不起作用?似乎每回合都有足够的回报,应该没问题。
解
这是一个异步问题,所以:
var user = new user();
function user() {
// returns true if the account is password protected
function isPasswordProtected(data, callback) {
//check if the account is a password protected account, and if so request the password.
$.post('function/get-ifpasswordprotected.php', {uid: data['uid']}, function(data) { callback(data);});
}
// function that returns 1 if the user is password protected
this.getPPStatus = function(**callback**) { isPasswordProtected({uid: this.userid}, **callback**); };
}
然后
user.getPPStatus(function(result) {
**DO STUFF HERE**
});
绝对不知道这是不是好javascript但是嘿,它有用...... :)
答案 0 :(得分:2)
有三个理由可以解决这个问题:
$.post
异步,因此如果isPasswordProtected
使用它来获取信息,则无法返回标记,当它返回时它还没有结果。有关详细信息,请参阅How do I return the response from an asynchronous call?。
即使$.post
是同步的(也可以是选项,但这不是一个好主意),$.post
并没有使用返回其回调值,因此该回调中的return
无法执行任何操作。
即使 $.post
要返回回调的结果(如果它是同步的(它没有),isPasswordProtected
也不会设置回报价值(在该代码中,return
没有isPasswordProtected
,只有回调到$.post
。)
上面的链接说明了如何更改getPPStatus
和isPasswordProtected
以解决异步问题,该问题本身也解决了return
的问题。