0

На сервере (yii2, activerecord select) выполняется запрос данных по поступившему по поступившему списку ID. Результат возвращается как массив( ->asArray, что ничего не меняет) с данными о записях с такими ID, конвертированными в JSON.

При этом в строке

 else result = JSON.parse(response);

Определяется переменная result и возвращается из функции. Однако, при распечатывании в консоль отображается как undefined (даже если убрать JSON.Parse). Если эту же строку заменить на alert(response), то данные отобразятся в алерте в JSON-виде. С чем связано и как фиксить?

var result;
            $.ajax({
                url: window.location.href,
                type: "POST",
                cache: true,
                dataType: 'json',
                data: {
                    ids: JSON.stringify(ids),
                    _csrf: token,
                },
                success: function (response) {

                    if(response == 0) {
                            alert("Ошибка #103. Обратитесь к нам по контактным данным.");
                            result = -1;
                        }
                    else result = JSON.parse(response);
                },
                error: (function (jqXHR, ex) {
                    if(jqXHR.statusCode != 200){
                        alert('Что-то пошло не так. Напишите нам об этой ошибке (#102) ' + jqXHR.responseText);
                    }
                })

            })
            return result;
FoGezz
  • 53
  • ajax - асинхронный процесс, ваш return result выполняется раньше, чем вызовется коллбек success ... фиксить либо промисами, либо вызовом функции в success в которую будут переданы данные пришедшие. – MedvedevDev Apr 13 '18 at 16:54
  • Проверка if(response == 0) { бессмыслена при dataType: 'json',. –  Apr 13 '18 at 16:56
  • @Igor, не уверен, но в json вроде может прийти пустая строка, что без приведения типов даст '' == 0 // true – MedvedevDev Apr 13 '18 at 16:57
  • @MedvedevDev Пустая строка не должна распарситься как правильный JSON. –  Apr 13 '18 at 16:59
  • 1
    @Igor, да, точно, но '0' все же может прийти и распарситься – MedvedevDev Apr 13 '18 at 17:00
  • Да, действительно, про асинхронность забыл. Самый простой способ решения оказался добавить в ajax - async: false. Также timeout: 2000, чтобы страница не повисла. – FoGezz Apr 13 '18 at 17:04
  • @FoGezz самый простой и самый плохой: http://api.jquery.com/jquery.ajax/ "As of jQuery 1.8, the use of async: false with jqXHR ($.Deferred) is deprecated" –  Apr 13 '18 at 17:10

0 Answers0