2009-11-13 3 views
3

У меня есть проблема, возвращающую переменную в моей функции, ниже скрипт работает отлично:Javascript функция возврата не работает

function sessionStatus(){ 
    $(document).ready(function(){ 
     $.getJSON(scriptRoot+"sessionStatus.php",function(status){ 
      alert(status); 
     }); 
    }); 
} 

sessionStatus(); 

Bet, когда я пытаюсь следующий я получаю окно с сообщением «не определено»:

function sessionStatus(){ 
    $(document).ready(function(){ 
     $.getJSON(scriptRoot+"sessionStatus.php",function(status){ 
      return status; 
     }); 
    }); 
} 
alert(sessionStatus()); 

Это действительно беспокоит меня, я просто не могу понять, что я сделал неправильно.

ответ

10

Есть две вещи, которые вы должны знать:

1: JSON вещь является асинхронным, поэтому вызов функции sessionStatus уже может быть сделано, когда JSON еще будучи неправдоподобным.Далее будет работать:

function sessionStatus(callback){ 
    $(document).ready(function(){ 
     $.getJSON(scriptRoot + "sessionStatus.php", function(status){ 
       callback(status); 
     }); 
    }); 
} 
sessionStatus(function(s){alert(s);}); 

или скорее:

function sessionStatus(callback){ 
    $(document).ready(function(){ 
     $.getJSON(scriptRoot + "sessionStatus.php", callback); 
    }); 
} 
sessionStatus(function(s){alert(s);}); 

2: даже тогда, когда это будет синхронным, вы только дает возвращаемое значение из внутренней функции, поэтому sessionStatus не вернется ничего. Проверьте этот код (не связанный с вашим JSON вещей):

function do() { 
    var x = 0; 
    (function(){ 
     x = 2; 
    })(); 
    return x; 
} 

или:

function do() { 
    var x = (function(){ 
     return 2; 
    })(); 
    return x; 
} 

Оба возвращают 2. Надеется, что это объясняет немного.

+0

+1 Отличный ответ от нового пользователя: D –

+0

Спасибо, приятное объяснение. – Stanni

2

Ваша функция sessionStatus() ничего не возвращает, поэтому предупреждение сообщает undefined.

Все функция не установлена ​​вещь для вызова AJAX произойдет один раз при загрузке страницы - ничего на самом деле не происходит вsessionStatus(), которые могут быть возвращены.

Код в function(status) { ...} не запускается до тех пор, пока вызов AJAX на сервер не вернет значение, и что вызов AJAX не будет отправлен до загрузки страницы.

Вы должны прочитать, что на самом деле делают $.getJSON() и $(document).ready(), потому что вы собираетесь продолжать запутывать поведение, пока не поймете их правильно.

+0

Итак, что такое «статус возврата»; тогда? Извините, но это еще больше смутило меня. – Stanni

+0

Возвращает статус, но он находится в анонимной функции, вызванной .getJSON, когда завершается HTTP-запрос. Это не статус возврата в рамках sessionStatus(); –

+0

@Stanni: статус возврата возвращает значение вызывающей стороне вашего обратного вызова JSON, что является самой jQuery. jQuery просто отбросит его. Ваш код не является одной из функций; это функция, определение которой вложено в функцию, которая сама вложена в другую функцию. Эти три функции вызываются в разное время в ответ на различные события. – RichieHindle

1

Функция sessionStatus() никогда ничего не возвращает. Он устанавливает функцию для запуска позже и , что функция возвращает что-то, но это не имеет ничего общего с sessionStatus()

1

Вы возвращаете значение, когда событие готовности документа завершено. Где ваша ценность должна идти? Объект jQuery не знает, что с ним делать.

1

Функция sessionStatus просто устанавливает прослушиватель событий для $ (document) .ready(), а затем возвращается без возврата значения. Это неизвестно, что вы видите.

Позже, когда запускается $ (document) .ready(), он вызывает ajax, который, если он успешно возвращает статус, но ничего не получает этот статус.

1
function sessionStatusCallback(status) 
{ 
    alert(status); 
} 

function sessionStatus(){ 
    $(document).ready(function(){ 
     $.getJSON(scriptRoot+"sessionStatus.php",function(status){ 
       sessionStatusCallback(status); 
     }); 
    }); 
} 

sessionStatus(); 

Ваша функция вызывается асинхронно - на самом деле после двух асинхронных вызовов осуществляется с помощью .ready() и .getJSON(). В таком случае нет доступного возвращаемого значения, вместо этого вы должны использовать обратный вызов, как описано выше, для обработки ответа.

Хотя я должен отметить, что функция, переданная getJSON в вышеперечисленном уже , является обратным вызовом. Вы можете изменить это определение функции только как «sessionStatusCallback», и он вызовет вышеупомянутый обратный вызов, как только JSON будет готов, и вы можете продолжить обработку там. Или ... продолжить обработку в текущем обратном вызове (вопрос о том, следует ли использовать ссылку на функцию или объявить анонимную функцию прямо там, в вызове .getJSON())

0

Функции никогда не должны включаться в jQuery (документ) .ready. Отделите их, поэтому у вас нет побочных эффектов, которые вы не хотите иметь. Как вы хотите назвать статус сеанса? И функция ведьмы должна получить возвращаемое значение?

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