如何在JavaScript函数中设置和返回变量?

时间:2012-02-09 09:02:04

标签: javascript function variables

首先查看示例然后您就可以理解我的问题了。

var x;
function checkTime() {
    $.ajax({ 
        type: 'GET', 
        url: 'http://www.example.com/time.php', 
        data: test,
        dataType:'json',
        success: function (data) {
            if (data == 0){
                x = 'true';
            } else if (data == 1){
                x = 'false';
            }
        }
    });
}

checkTime();
alert (x);

警报将为undefined

我需要在x函数中设置checkTime并将其抓取到函数之外

即使我这样做:

var x = checkTime();
alert (x);

我仍然得到undefined

我也只需要检查是真还是假,也许还有另一种方法可以做。我也尝试过:

...
if (data == 0){
    return true;
} else if (data == 1){
    return false;
}
...

但我不知道如何检查。

基本上我需要这样的东西:

if(x == 1){// if(x == true)     //做一点事 }

任何想法?

感谢

4 个答案:

答案 0 :(得分:4)

这是因为.ajax()的默认行为是异步。在x点火之前,alert()不会被设置。您需要将.ajax()设置为aync=false或传入回调函数以在Ajax请求完成时调用,例如

function checkTime(callback) {
    $.ajax({ 
        type: 'GET', 
        url: 'http://www.example.com/time.php', 
        data: test,
        dataType:'json',
        success: function (data) {
            var x = '';
            if (data == 0){
                x = 'true';
            } else if (data == 1){
                x = 'false';
            }
            // Call the callback function with 'x'
            callback.call(null, x);
        }
    });
}

然后使用它如下:

checkTime(function (x) {
    alert(x);
});

答案 1 :(得分:2)

这是因为AJAX是异步的。当您的代码达到警报时,AJAX请求的成功函数尚未执行。您可以尝试将ajax请求设置为async:false,或者在success函数内部设置警报。

答案 2 :(得分:1)

您无法直接访问为“成功”定义的函数的返回值;首先,您应该知道这里涉及两个函数:checkTime,以及ajax调用成功事件的未命名事件处理函数。您想要从该未命名的事件处理函数中检索一个值;但是,该函数不是直接从checkTime调用的,但是当AJAX请求返回时(它是event-driven programming:当事件 AJAX调用成功时,执行function (data) {...} )。

在您的示例中,执行alert后调用的checkTime通常会在AJAX请求完成之前调用;这是因为AJAX请求发生异步,因此调用成功的事件还没有发生。如果您总是希望等待请求的答案,则可以禁用AJAX调用的异步性(async:false);但也许您也可以直接在事件处理程序中而不是在外部进行区分。如果你想要遵循事件驱动的编程范例,这将是一种方法。

如果您想在请求运行时继续执行其他操作,您的选项还包括:使用一些其他(例如全局)变量作为成功函数AJAX调用的“返回值”(可能还有一秒用于指示调用是否已完成),并定期检查它是否已设置(但不会跟随事件驱动的编程范例,可能被认为是不好的做法,因为需要不必要的频繁轮询变量。)

答案 3 :(得分:0)

这是因为checkTime()在执行成功函数之前立即返回。成功函数在ajax调用完成之后才会执行,因此当您尝试使用它时,x尚未设置。

根据您要完成的操作,您可以将警报置于成功回调中。