Javascript ajax未在声明的变量上设置值

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

我对这个javascript函数有一个问题。我想做的是,使用ajax调用查找特定的材质描述。当我尝试对ajax函数进行console.log时,数据就会显示出来。但是当我设置为数组时,它不会设置数组值并跳过。使用async:false给我以下警告:

主线程上的同步XMLHttpRequest不推荐使用,因为它会对最终用户的体验产生有害影响

没有异步将给我未定义的结果

$('#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