2013-06-12 86 views
1
function check_login(){ 
    var authenticated = false; 
    $.ajax({type:"POST",url:"/account/islogin/",data:"",async:"false", 
     success:function(data){ 
      if(data=="null"){ 
       signup(); 
       authenticated = false; 
      } 
      authenticated = true; 
     } 
    }); 
    return authenticated; 
}; 

爲什麼函數總是返回false,即使authenticated=true被執行。如何通過ajax在javascript中更改局部變量?

+0

Null是原始類型。不檢查爲空作爲字符串 – karthikr

+0

成功函數被異步調用。 check_login()將總是返回false,因爲稍後會調用成功函數 – x4rf41

+2

您缺少'else' – Gerep

回答

3

問題是,如果您運行語句,然後每次都將驗證設置爲true,則會運行您的問題。這聽起來像你正在尋找一個if else語句。

function check_login(){ 
    var authenticated = false; 
    $.ajax({type:"POST",url:"/account/islogin/",data:"",async:false, 
     success:function(data){ 
      if(data=="null"){ 
       signup(); 
       authenticated = false; 
      } else { 
       authenticated = true; 
      } 
     } 
    }); 
    return authenticated; 
}; 

甚至更​​好,你可以設置驗證爲默認爲true,然後只在數據爲空時將其設置爲false。

function check_login(){ 
    var authenticated = false; 
    $.ajax({type:"POST",url:"/account/islogin/",data:"",async:false, 
     success:function(data){ 
      authenticated = true; 
      if(data=="null"){ 
       signup(); 
       authenticated = false; 
      } 
     } 
    }); 
    return authenticated; 
}; 
+2

我認爲另一個問題是請求是異步的。 「假」可能被認爲是真值。 –

+0

我認爲這與ajax調用如何被觸發有關。 http://stackoverflow.com/questions/1478295/what-does-async-false-do-in-jquery-ajax –

+3

我不明白你想告訴我什麼,所以我會詳細說明:OP的代碼將只有在請求是**同步**時纔有效。這就是爲什麼他們設置'async'選項,但他們傳遞一個(非空)字符串作爲值而不是布爾值。我認爲我們可以假設內部jQuery只用'if(option.async)'測試選項。因此'async:「false」'將等同於'async:true',即請求將是異步的,並且函數將始終返回'false'。 –

-2

因爲你的Ajax函數內部的變量authenticated和內部check_login()一個在不同的範圍。他們不能互相影響。

+0

傳遞給'$ .ajax'的回調是**閉包** 。它可以訪問'check_login'中定義的'authenticated'。 –

+0

我可以發誓我有這個確切的問題,即使對我來說它看起來像一個閉包,因此應該工作它不會和兩個變量couldn當然,如果你用兩個降價來判斷我肯定是錯的 – MrMisterMan

+1

@MrMisterMan - 如果你用'var'重新聲明瞭變量,就會發生這種情況 – Igor