Javascript ajax未在声明的变量上设置值
我对这个javascript函数有一个问题。我想做的是,使用ajax调用查找特定的材质描述。当我尝试对ajax函数进行console.log时,数据就会显示出来。但是当我设置为数组时,它不会设置数组值并跳过。使用async:false给我以下警告: 主线程上的同步XMLHttpRequest不推荐使用,因为它会对最终用户的体验产生有害影响 没有异步将给我未定义的结果Javascript ajax未在声明的变量上设置值,javascript,jquery,ajax,asp.net-mvc,razor,Javascript,Jquery,Ajax,Asp.net Mvc,Razor,我对这个javascript函数有一个问题。我想做的是,使用ajax调用查找特定的材质描述。当我尝试对ajax函数进行console.log时,数据就会显示出来。但是当我设置为数组时,它不会设置数组值并跳过。使用async:false给我以下警告: 主线程上的同步XMLHttpRequest不推荐使用,因为它会对最终用户的体验产生有害影响 没有异步将给我未定义的结果 $('#iBarcode').keypress(function (keyPressed) { if (k
$('#iBarcode').keypress(function (keyPressed) {
if (keyPressed.which == 13) {
var barcode = $('#iBarcode').val()
var splitted = new Array()
var arrayCnt = -1;
for (var i = 0; i < barcode.length; i++) {
var flagStart;
if (barcode.charAt(i) == ')') {
flagStart = true
i += 1
arrayCnt += 1
splitted[arrayCnt] = ''
}
if (barcode.charAt(i) == ('(')) {
flagStart = false
}
if (flagStart == true) {
splitted[arrayCnt] = splitted[arrayCnt] + barcode.charAt(i)
}
}
console.log(setMatDesc(splitted[0])) //value showed here
splitted[arrayCnt + 1] = setMatDesc(splitted[0]) //value not showed here and skipped?
splitted[arrayCnt + 1] = currentDate
$('#iBarcode').val('').focus
console.log(splitted)
}
})
function setMatDesc(MatID) {
var result
$.ajax({
url: '@Url.Action("Get_MatDesc")',
type: 'GET',
async: false,
data: { MatID: MatID },
success: function (data) {
result=data
},
error: function (xhr) {
alert('error');
}
})
return result
}
非常感谢您的帮助。您需要提供一个回调函数,该函数将在ajax调用完成后执行,如:
function setMatDesc(MatID, calback) {
var result
$.ajax({
url: '@Url.Action("Get_MatDesc")',
type: 'GET',
async: false,
data: { MatID: MatID },
success: function (data) {
callback(data); // note this
},
error: function (xhr) {
alert('error');
}
});
}
在呼叫端,您可以这样做:
setMatDesc(splitted[0],function(result) {
splitted = result;
splitted[arrayCnt + 1];
splitted[arrayCnt + 1] = currentDate;
});
代码可能不起作用,因为我还没有测试过,但这是从执行ajax调用的函数返回数据的方法,因为ajax调用是异步执行的,函数在ajax调用从服务器返回之前执行正文。是否尝试了async:true?是的,它不起作用我们应该了解异步请求是如何工作的,当您调用setMatDescsplitted[0]时,将触发ajax,但主线程不会等待ajax完成,因此您的splitted[arrayCnt+1]=setMatDescsplitted[0]将无法工作,因为值尚未返回,您可以查看javascript的承诺。相关:。然后,和/或仍然在学习这个异步的东西。如果没有async:false是否可能?这将与async:truehmm true一起工作,但它仅使用alertresult显示。使用结果分配变量not working我必须在setMatDesc之后添加WAIT,并且其使用async:true