2009-08-09 51 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) 
}