2009-08-09 118 views
1

我对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.

任何人都可以给我任何建议,让这个工作的最佳途径?

非常感谢。

+0

好恶,少全局变量越好。在这样的情况下,你做错了什么。 – Dykam 2009-08-09 18:25:38

回答

3

在你选项1你是从回调函数返回,并且从不使用它的返回值,因为这个函数只在Ajax请求结束时被调用。

选项2中,您从主函数返回,但返回发生在回调函数将任何值分配给您的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){ 
    //... 
} 
8

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

您可以做的最好的事情实际上是传递一个函数在ajax请求完成时运行。这也否定了需要它们,因为其他插件令人难以接受的全局变量,脚本可以改变自己的状态,并留下您打开脚本错误,瑕疵等

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'); 

} 
3

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

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被声明函数范围的变量。

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) 
}