Javascript错误的警报顺序

时间:2012-07-19 00:54:36

标签: javascript jquery

我有这样的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

我该怎么办?

5 个答案:

答案 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]