2012-04-09 3 views
0

У меня есть 2 функции: 1 проверяет, что пользователь вошел в систему, а если он это делает - он вызывает вторую функцию для получения своего идентификатора пользователя. На данный момент я просто тестирую его с предупреждением, чтобы узнать, действительно ли я получаю параметр.Получение значения из функции с помощью Javascript

Это первая функция:

//Checking if the user is logged in or not 
$(function(){ 
$.getJSON("inc/API.php", {command : "getUserName"}, 
    function(result){ 
     if(result==null){ 
      $("#divGreeting").html("Hello, guest!"); 
      $("#divLogin").hide(); 
      $("#divUserOption").hide(); 
      $("#divConnectOption").show(); 
     } 
     else { 
      alert(getUserID(result)); 
      $("#divGreeting").html("Hello, "+result+"!"); 
      $("#divHeader").html("Hello, "+result+"! <a href='javascript:logout()'>Logout</a>"); 
      $("#divUserOption").html("Hello, "+result+"! <a href='javascript:logout()'>Logout</a>"); 
      $("#divConnectOption").hide(); 
      $("#divLogin").hide(); 
      $("#divUserOption").fadeIn(300); 
     } 
    }); 
}); 

И это вторая функция, тот, который должен вернуть идентификатор_пользователя:

function getUserID(){ 
$.getJSON("inc/API.php", 
{ 
    command : "getUserID" 
}, 
function(result){ 
    alert(result); 
    return result; 
}); 
} 

alert первой функции undefined, в то время как предупреждение второго имеет идентификатор пользователя. Почему я не могу вернуть его значение первой функции? Почему я получаю `undefined?

Спасибо! `

ответ

1

Ajax является асинхронной. Вы не можете вернуть значение из него.

Что пытаются сделать, это сродни:

function foo() { 
    $('button').click(function() { return 1; }); 
} 
var not_one = foo(); 

В этом примере значение не возвращается, пока кнопка не будет нажата (и это не возвращаемое значение foo в любом случае). С помощью Ajax значение не возвращается до получения ответа HTTP.

Вы должны обработать данные в функции обратного вызова и не пытаться вернуться к вызывающей функции.

+0

Я попытался использовать обратный вызов, но думаю, что это неправильно. Я пробовал так: 'функция getUserID (обратный вызов) { \t $ .getJSON ("вкл/API.php", \t { \t \t Команда: "getUserID" \t}, \t функция (результат) { \t \t предупреждение (результат); \t \t callback (результат); \t}); } 'но все же' undefined'. Что я делаю не так? Спасибо! – Igal

0

Попробуйте это:

//Checking if the user is logged in or not 
$(function(){ 
$.getJSON("inc/API.php", {command : "getUserName"}, 
    function(result){ 
     if(result==null){ 
      $("#divGreeting").html("Hello, guest!"); 
      $("#divLogin").hide(); 
      $("#divUserOption").hide(); 
      $("#divConnectOption").show(); 
     } 
     else { 
      getUserID(function(result) { 
       $("#divGreeting").html("Hello, "+result+"!"); 
       $("#divHeader").html("Hello, "+result+"! <a href='javascript:logout()'>Logout</a>"); 
       $("#divUserOption").html("Hello, "+result+"! <a href='javascript:logout()'>Logout</a>"); 
       $("#divConnectOption").hide(); 
       $("#divLogin").hide(); 
       $("#divUserOption").fadeIn(300); 
      }); 
     } 
    }); 
}); 

, а затем вашу функцию getUserID:

function getUserID(callback){ 
    $.getJSON("inc/API.php", 
    { 
     command : "getUserID" 
    }, 
    callback 
} 

EDIT

Вы сказали, что вам нужно будет использовать имя пользователя в контексте конкатенации:

"Hello "+getUserName()+"!"

Однако, если он должен делать запрос AJAX каждый раз, это невозможно, если не используется блокирующий синхронный вызов, который не является хорошей практикой вообще. Если вы сохраняете имя пользователя в переменной при загрузке страницы, вы можете просто использовать переменную. если вы хотите по-прежнему использовать функцию, которая запрашивает ее каждый раз, когда она используется, это должно быть сделано примерно так:

function getUserName(callback) { 
    $.getJSON("inc/API.php", {command : "getUserName"}, callback); 
} 

getUserName(function(result){ 
    //do username processing here 
}); 
+0

Ну, это близко ...Теперь эта часть 'getUserID (function (result) { $ (" # divGreeting "). Html (" Hello, "+ result +"! ");' Некорректно испорчен, он использовал для получения 'result' из этой части' $ .getJSON ("inc/API.php", {command: "getUserName"}, Функция (результат) 'и отображение UserName, но теперь она отображает идентификатор пользователя. Как я могу получить как UserName, так и ID пользователя? Спасибо! – Igal

+0

забыл упомянуть, что в конечном итоге код userName должен выглядеть примерно так: '"+result(displays the userName here)+"' – Igal

+0

нужно было бы сделать так же, как и в моем ответе, все вызовы ajax должны быть асинхронными, чтобы тип конкатенации строк не будет работать с AJAX, если вы не используете синхронные вызовы, что совершенно неприемлемо. – nathanjosiah

Смежные вопросы