Jquery $ .post()变量范围

时间:2009-08-09 18:22:20

标签: javascript jquery scope

我对JavaScript没有多少经验,我在使用变量范围和jquery时遇到了麻烦。我有以下结构:

function pass_variables()
{
    username = "efcjoe"
    response = post_variables(username)
    alert(response)
}

function post_variables(username)
{
    $.post(
        '/path/to/url/',
        {
            'username': username,
        },
        function(data)
        {
            valid = (data != 0) ? true : false

            // OPTION 1: If I put return here...
            return valid; // ... the alert box in pass_variables says "undefined"
        },
        "text"
    );

    // OPTION 2: If I put return here...
    return valid; // ... The alert box does not pop up, and Safari debug gives
                  //     me the error: "Can't find variable: valid"
}

我错过了什么吗?我认为valid应该是一个全局变量,因此选项2应该可以正常工作。我真的不确定选项1。

任何人都可以就如何使其发挥作用向我提出任何建议吗?

非常感谢。

5 个答案:

答案 0 :(得分:8)

Ajax调用是异步的,这意味着它们被调用但是等待执行完成。基本上,您的警报在ajax请求完成之前触发,并运行回调函数来更改您的变量。

你可以做的最好的事情是在ajax请求完成时传递一个函数来运行。这也否定了对全局变量的需求,因为其他插件,脚本可以改变它们的状态并让你的脚本容易出错,缺陷等等,这是不受欢迎的全局变量。

E.g

function foobar(){

   //call function to do post request and also pass a function to run
   //when post has returned
   runPostRequest( callbackFn );

}

function runPostRequest(callback){

    $.post( '/foo', callback );

}

function callbackFn( data ){

   console.log('post request complete');

}

答案 1 :(得分:3)

是的,你的问题是你在这里没有掌握一些操作顺序。您传递给$.post的功能是回调;在post_variables()完成后,它会很晚才运行。 post_variables()本身并不等待$.post完成,因此当您尝试使用valid时,{{1}}不存在。

答案 2 :(得分:3)

选项1 中,您将从回调函数返回,并且永远不会使用其返回值,因为只有在Ajax请求结束时才会调用此函数。

选项2 中,您将从main函数返回,但该回调发生在回调函数为您的valid变量赋值之前。

我会以这种方式重构您的代码,而不使用全局变量:

function post_variables(username){
  $.post('/path/to/url/',{
    'username': username,
  },
  function(data){
    var valid = data != 0;

    // OPTION 3: Work in the callback function
    alert(username);
    alert(valid);

    // OPTION 4: Pass the values and work on another function
    otherFunction(username, valid);
  },"text");
}

function otherFunction(username, isValid){
  //...
}

答案 3 :(得分:2)

请记住,AJAX是异步的。 return valid;$.post()设置之后,但在帖子完成之前(因此,在定义valid之前)立即执行 。您可能想要做的是:

function post_variables(username)
{
    var username = "efcjoe";

    $.post(
        '/path/to/url/',
        {
            'username': username,
        },
        function(data)
        {
            var valid = (data != 0) ? true : false
            alert(valid);
        },
        "text"
    );
}

请注意,这不再需要全局变量,而是需要使用var声明的函数范围变量。

答案 4 :(得分:1)

您可以通过为函数分配函数而不是内联函数来轻松解决问题,并且事件函数会执行警报:

function pass_variables()
{
    username = "efcjoe"
    response = post_variables(username);
}

function post_variables(username)
{
    $.post(
        '/path/to/url/',
        {
            'username': username,
        },
        receivedData,
        "text"
    );
}

function receivedData(data)
{
    valid = (data != 0) ? true : false;
    alert(valid)
}