我有这样的javascript调用:
usernameTest('queijo');
alert('a');
函数usernameTest()
正在运行,为了进行调试,它会提醒字符串“t”或“f”。
为什么,当我加载此页面时,显示的第一个警报是“a”,仅在“t”或“f”之后? (顺便说一句,jQuery也被加载到页面中。)
[编辑]
源代码:
function usernameTest(username) {
var unReg = /^[0-9a-zA-Z_]{1,20}$/;
if(!unReg.test(username))
return false;
$.ajax({
type : 'POST',
url : 'checkuser.php',
data : 'username=' + username,
cache : false,
success : function(response) {
if(response == 1) {
alert('f');
return false;
} else {
alert('t');
return true;
}
}
});
}
[EDIT2]
我已经知道问题是调用AJAX。新的主要问题现在是另一个问题。 我这样称呼它(在适当的地方,而不是调试代码);
if(!usernameTest(argument))
//do something
我该怎么办?
答案 0 :(得分:2)
@Bergi所说的或usernameTest()
是一个AJAX函数 - 这意味着它是异步的。考虑在问题中加入usernameTest()
函数的来源 - 这样会更容易回答。
更新:我看到它是一个AJAX功能。您需要将代码置于回调中:
success : function(response) {
if(response == 1) {
//do stuff here - you can't return from here as this is asynchronous - i.e. happening independently (not at the same time) of the rest of the code
} else {
//do stuff here - you can't return from here as this is asynchronous - i.e. happening independently (not at the same time) of the rest of the code
}
}
答案 1 :(得分:1)
usernameTest
发出ajax请求。 ajax中的第一个A代表异步:发出请求,代码执行立即继续,包括alert('a')
调用。只有当响应从服务器返回时才会执行成功回调,包括alert('t')
。
这种异步执行风格是Javascript开发的核心。你必须拥抱它并用它来解决你的问题。战斗只会导致悲伤。
请注意,您拥有的return语句不会返回usernameTest
的值。他们从成功回调中返回。您的usernameTest
函数不会返回任何内容。没有办法将这样的异步请求转换为同步函数返回。
您需要找到一种异步使用服务器答案的方法。例如,无论你打算将什么放入调用的if
子句中,而是将该代码放入成功回调本身。然后它可以访问true或false值。
答案 2 :(得分:1)
如果要使用的代码可能会根据系统状态发生变化,您可以将该函数作为参数传递给usernameTest,以执行您想要的操作。否则,您可以直接在if语句中编写代码。
function usernameTest(username, onFailure) {
// code here...
$.ajax({
// ajax setup here...
success : function(response) {
if(response == 1) {
//...
} else if (typeof(onFailure) === 'function' ) {
onFailure();
}
}
});
}
var name = 'Bob';
var onFailure = function() {
// do something
};
usernameTest(name, onFailure);
此外,请在提出问题时尝试具体说明,除非不清楚或需要详细说明,否则请勿更改问题。如果有人回答了原始问题,他/她应该获得信用,其他问题应该单独询问。
答案 3 :(得分:0)
您的usernameTest
函数不提醒任何内容,否则会在警报“a”之前发出警告。
我确定它会安装一个事件监听器(可能是文档就绪? - 如果你给我代码,我可以告诉你更多),其中“用户”被警告。事件监听器函数不会立即执行,但有些将来会执行。
答案 4 :(得分:0)
永远不要使用警报。使用(){console.log()}或(){console&& console.log()}。
通过使用警报,您只能看到一条消息。你永远不想拥有的消息。
使用console.log,您可以在实例中看到函数的消息, 不打破网络:
什么? [OK]