Я пытаюсь сделать рабочий стол похожим на справку по вводу текста, используя таблицу 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')
используйте этот код в файле 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;
}
так что плз. дайте решение этой проблемы
Я уже сделал под вопросом. Решение можно найти здесь.
Привет, Ивар, спасибо за ценное решение. Если я правильно понял, здесь должно помочь присвоение значения переменной внешней области видимости, но в моем случае " retData = response.data;" где retData — переменная внешней области видимости вне функции ajaxCall. Но все же он называется асинхронным и не таким, как ожидалось. Хотя это не рекомендуется, у меня сработал async:false. но я хочу реализовать надежное решение. любое дальнейшее предложение плз.
@AhmedRaza Назначение внешней области не работает, потому что код внутри обратного вызова success
будет выполнен после запуска return retData
. Таким образом, когда вы возвращаете данные, retData
все еще null
. Дубликат, который вы приняли, объясняет эту концепцию и способы ее использования. Учитывая, что вы приняли это, я надеюсь, что это помогло вам.
Использование
async: false
не рекомендуется и не рекомендуется из-за его пагубного воздействия на опыт конечного пользователя. Не используйте его.