0

У меня есть асинхронная функция, которая запрашивает данные по Ajax и может быть вызвана далеко не 1 раз. Облегчив себе работу вынес все дело с запросом в отдельную функцию и написал return data; и... Получил undefined.

Функция простая, не буду здесь постить ее копию, сделал простой вариант для примера, что бы было на чем показывать:

$("#loadmore").on('input', function() {

var test; sendData(function(outputData) {

  test = outputData;

}); console.log(test);

}); function sendData(callback) { //код запроса ajax //... //успех

success: function(data, xhr) {

  outputData = JSON.parse(data);
  callback(outputData); 

} }

Этот код не работает, но я могу работать с данными внутри коллбека, это я понял. Но есть ли возможность вынести данные из функции, примерно как в этом коде?

Telion
  • 1,810
  • вроде в JS уже завезли async/await? – VladD Aug 04 '17 at 16:45
  • Просто берите да выносите как обычно, коллбек это самая обыкновенная функция, как и любая другая. Просто учитывайте, что коллбек может быть вызван в абсолютно любой момент времени (хоть прямо сейчас, хоть через год), и на момент выполнения console.log(test) коллбек, скорее всего, ещё не запускался и поэтому test ещё пустой. – andreymal Aug 04 '17 at 16:49
  • @VladD Я посмотрел. Это из strict? Я пока приторможенный, пишу на старом... – Telion Aug 04 '17 at 16:53
  • @Telion это из Babel) – andreymal Aug 04 '17 at 16:54
  • @andreymal дак в этом и проблема! Как обычно не работает, получается неопределенное значение. Сколько инпутов не проходит и колбеков не тригерится все незаданные. – Telion Aug 04 '17 at 16:54
  • 1
    @Telion замените console.log на setInterval(function(){console.log(test);}, 100); и вы увидите, что всё работает ровно так, как я рассказал. – andreymal Aug 04 '17 at 16:58
  • @Telion и вообще — что вам мешает работать с данными внутри коллбека? Именно так все и делают. – andreymal Aug 04 '17 at 17:00
  • @andreymal Хм.. Да, работает, это я понял. Но в js нет никаких встроенных возможностей сделать то же без задержки? (в плане работать через setInterval это извращение). – Telion Aug 04 '17 at 17:02
  • @VladD, вроде в JS уже завезли async/await? - в последней спецификации уже есть официально, хром точно поддерживает, но какие еще браузеры поддерживают - не знаю – Grundy Aug 04 '17 at 17:03
  • 1
    @Telion ну, вообще в принципе есть, но от этого страница зависает нахрен и поэтому никто никогда так не делает, все просто обрабатывают данные в коллбеках и не парятся – andreymal Aug 04 '17 at 17:04
  • @Grundy Если верить мозилле то ECMAScript 2017 Draft (ECMA-262) поддерживается уже всеми последними браузерами не включая IE и Edge. – Telion Aug 04 '17 at 17:04
  • @andreymal Окей, посмотрю что можно сделать. Спасибо за внимание. – Telion Aug 04 '17 at 17:05
  • @Telion, тогда смотри пример использования в дубликате :) – Grundy Aug 04 '17 at 17:05

0 Answers0