0

Здравствуйте. Подскажите, как записать в переменную результат работы Ajax-запроса? Дело в том, что когда я выполняю операции с этим результатом в самой функции, которая выполняет запрос - этот результат доступен. Но когда я пишу в этой функции return respone - эта функция ничего не возвращает. Объясните, пожалуйста, как записать результат запроса в переменную или массив /объект, чтобы позже использовать его в другой функции?

Пример:

    //Ajax-запрос
$.getJSON(url, {}, function(response) {
  returnValue(response['def']); // нужный объект
});

//функция-обработчик
function returnValue(val) {
  alert(val); //есть результат
  console.log(val); //есть результат

  return val; //ничего не возвратит
}

//запускаю функцию
returnValue(); //ничего нет (даже undefined)
topvova
  • 47

1 Answers1

1

Здесь вы вызываете returnValue с передачей ей параметра который она возвращает.

 function(response) {
  returnValue(response['def']); // нужный объект
} 

//запускаю функцию
returnValue(); //ничего нет (даже undefined)

А здесь собственно без параметра, что она по вашему должна вернуть? Вам нужно обработать ответ сервера в коллбеке, либо использовать механизм Promise.

Chemaxa
  • 411
  • А какой параметр ей передать, если она за пределами функции запроса? – topvova Apr 30 '16 at 18:17
  • Вы НЕ можете вернуть значение из асинхронной функции! Вы ДОЛЖНЫ обработать ответ в асинхронной функции ИЛИ использовать механизм промисов https://learn.javascript.ru/promise#промисификация – Chemaxa Apr 30 '16 at 18:25
  • Спасибо за ответ, буду знать. Пожалуйста, напишите пример правильной обработки или исправьте мой. – topvova Apr 30 '16 at 19:14
  • Так у вас собственно все уже и написано вот в этой строке $.getJSON(url, {}, function(response) { returnValue(response['def']); // нужный объект }); Вы просто должны понимать что это АСИНХРОННЫЙ код, вы не сможете получить доступ к какому-либо значению переменной пока не придет ответ от сервера. Поэтому весь код который описан вне функции колбэка не сможет получить доступ к переменной response никак, вам нужно работать с ним только тут. – Chemaxa Apr 30 '16 at 19:48
  • Я это уже понял. Но что делать, когда нужно писать много кода, который взаимодействует с ответом сервера? Тогда эта функция приобретает нехороший вид. – topvova May 01 '16 at 05:32
  • Передавать ответ сервера в другие функции в виде параметров, или строить цепочки промисов. – Chemaxa May 01 '16 at 19:23