Ajax-вызов возвращает «undefined» только во время первого вызова

Я пытаюсь сделать рабочий стол похожим на справку по вводу текста, используя таблицу datatable.in с навигацией по клавиатуре. Для этого я динамически меняю источник, а также меняю столбец заголовка. До сих пор мне это удалось, за исключением получения динамического заголовка столбца.

Чтобы получить заголовок столбца на основе заголовка ввода текста, я делаю вызов ajax и получаю список заголовков столбцов. проблема в том, что во время первого вызова ajax возвращает undefined, но во втором вызове показывает значение. Я понимаю, что это относится к асинхронному вызову, но не знаю, как с этим справиться.

Ниже мои фрагменты кода.

Вызов AJAX во внешнем .js

function ajaxCall(ipUrl, callType = "POST", dataIn) {
 
    return $.ajax({
        url: ipUrl,
        type: callType,
        data: dataIn,
        dataType: "json",
        success: function (response) {

        retData = response.data;
        alert('success'+ retData);
        return retData;             
    }, error: function (err) {
            alert("fail" + JSON.stringify(err));
        }, //error
    });
    //alert('in js'+ retData);
    //return retData;     
}

Тег HTML-скрипта

$("#btn").click( function (e) {
    var tData = { action: 'getHeader',
        csrfmiddlewaretoken: 'Gys4TSx3ODJLcMDuXlSvS7DopVZr1HWEDLg9AlJsARXp7wmUGAxxKwo6uLVXIrf2',
    }    
    tmp = ajaxCall('dyncolheader','GET',tData) ;
    if (tmp == undefined) {
        alert('second call');
        tmp = ajaxCall('dyncolheader','GET',tData) ;
        alert('tmp' + tmp);
    } else {
      alert('else' + tmp);
    }       
});

Джанго Посмотреть код

def dyncolheader(request):
  hrdText = 'First,Second,Third'  
   
if request.is_ajax and request.method == 'GET':
    print('ajax call')          
    if request.GET.get('action') == 'getHeader':       
        print('get header')          
        return JsonResponse({ 'data': hrdText }, status=200)
    
return render(request, 'dyncolheader.html')
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
946
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

используйте этот код в файле external.js

function ajaxCall(ipUrl, callType = "POST", dataIn) {
    console.info('function Call', ipUrl, callType, dataIn);
    retData = null;

    $.ajax({
        url: ipUrl,
        type: callType,
        data: dataIn,
        dataType: "json",
        async: false,
        success: function (response) {
            retData = response.data;
        },
        error: function (err) {
            alert("fail" + JSON.stringify(err));
        },
    });
    console.info('retData', retData);
    return retData;
}

так что плз. дайте решение этой проблемы

Nikunj 15.12.2020 18:57

Я уже сделал под вопросом. Решение можно найти здесь.

Ivar 15.12.2020 19:37

Привет, Ивар, спасибо за ценное решение. Если я правильно понял, здесь должно помочь присвоение значения переменной внешней области видимости, но в моем случае " retData = response.data;" где retData — переменная внешней области видимости вне функции ajaxCall. Но все же он называется асинхронным и не таким, как ожидалось. Хотя это не рекомендуется, у меня сработал async:false. но я хочу реализовать надежное решение. любое дальнейшее предложение плз.

AhmedRaza 15.12.2020 20:34

@AhmedRaza Назначение внешней области не работает, потому что код внутри обратного вызова success будет выполнен после запуска return retData. Таким образом, когда вы возвращаете данные, retData все еще null. Дубликат, который вы приняли, объясняет эту концепцию и способы ее использования. Учитывая, что вы приняли это, я надеюсь, что это помогло вам.

Ivar 16.12.2020 15:45

Другие вопросы по теме