1

我有一个这样的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;
            }
        }
    });
}

[编辑2]

我已经知道问题在于调用 AJAX。新的主要问题现在是另一个问题。我这样称呼它(在适当的地方,而不是用于调试的代码);

if(!usernameTest(argument))
    //do something

我怎么能做这样的事情?

4

5 回答 5

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
            }
        }
于 2012-07-19T01:03:34.830 回答
1

usernameTest发出ajax请求。ajax 中的第一个 A 代表异步:发出请求,然后代码立即继续执行,包括alert('a')调用。只有当响应从服务器返回时才会执行成功回调,包括alert('t').

这种异步执行风格是 Javascript 开发的核​​心。你必须接受它并用它来解决你的问题。与之抗争只会带来悲伤。

请注意,您拥有的 return 语句不会从usernameTest. 他们从成功回调中返回。您的usernameTest函数不返回任何内容。没有办法将这样的异步请求转换为同步函数返回。

您需要找到一种方法来异步使用来自服务器的答案。例如,无论您要在if调用的子句中放入什么,而是将该代码放入成功回调本身。然后它将有权访问 true 或 false 值。

于 2012-07-19T01:17:25.723 回答
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);

另外,当你提出问题时,请尽量具体,除非不清楚或需要详细说明,否则不要更改问题。如果有人回答了最初的问题,他/她应该得到认可,其他问题应该单独提出。

于 2012-07-19T01:41:26.630 回答
0

永远不要使用警报。使用 () { console.log() } 或 () { console && console.log() }。

通过使用警报,您只会看到一条消息。你从来不想拥有的味精。

使用 console.log 您可以在实例中看到函数的消息,而不是破坏网络:

什么?[好的]

于 2012-07-19T01:40:39.423 回答
0

您的usernameTest函数不会发出任何警报,否则会出现在警报“a”之前。

我确定它为某些东西安装了一个事件侦听器(可能是文档就绪?-如果您给我代码,我可以告诉您更多信息),其中“用户”被警告。事件侦听器函数不会立即执行,而是在将来的某个时间执行。

于 2012-07-19T00:59:03.367 回答