ajax调用没有按顺序进行,为什么?

时间:2017-06-03 13:17:20

标签: javascript jquery ajax

我已经在我的一个块中进行了ajax调用但是我的问题是每次执行此块时,ajax调用不是按顺序执行的,而是每次粗体线在斜体线之后执行,但它应该第一次称ajax顺序进行。

我想知道为什么会出现这种行为,更不用说我是初学者了。

提前致谢!

if(pkgIdStr == 519 && !pkgFetched){
    var subscribableUnitEl =  document.getElementById('subscribableUnit');  
    var pkColEl = document.getElementById("pkCol");
    pkColEl.style.width = "50%";
    var suColEl = document.getElementById("suCol");
    suColEl.style.width = "50%";
    var pkDivEl = document.getElementById("pkDiv");
    pkDivEl.style.paddingLeft = "30%";
    subscribableUnitEl.style.display = "block";
    subscribableUnitEl.setAttribute("required","true");

     *var su_list = "";*
     $.ajax({
            url : '/user/ajax/getAvailableSUsforGenericKey.htm',
            data : 'scratchCardNumber ='+value,
            type : 'POST',
            dataType: 'text',
            success : function(data) {

                var json=JSON.parse(data);
                var jsonlist = json.allSU;
                var su_array = [];
                for(var i=0; i < jsonlist.length; i++){
                    var x=jsonlist[0].split(',')[1].split(': ')[1];
                    su_array.push(x);
                }
                su_list =su_array.toString();

                    },
            error: function (data) {
                $('#actionMessage').html("<p style='color: red'>cannot load the email - contact tech team please!</p>");}


            });

    **var availableSUStr =su_list ;**// registerInterface.getAvailableSUInSdcard();
                            //su to be fetched here..
    var availableSUnits = availableSUStr.split(",");
    var suOptions = subscribableUnitEl.options;
    suOptions.length = 0;
    suOptions[0] = new Option("Please Select One",-1);
    for(var j=1;j<=availableSUnits.length;++j) {
        var tokenArr = availableSUnits[j-1].split(":");
        if(tokenArr.length != 2)
            continue;
        suOptions[j] = new Option(tokenArr[1],tokenArr[0]);
    }
    pkgFetched = true;
    suOptions[0].selected=true;
    showAlert("Product key entered requires a package to be selected");
    return true;    
}

3 个答案:

答案 0 :(得分:1)

Ajax调用是异步的,即在不等待结果的情况下调用它。因此,在调用返回后,您想要完成的所有操作(按顺序),您需要输入成功函数。

但是,像Sparky提到的那样,也可以通过禁用异步行为来等待Ajax调用完成。在您的情况下,Ajax调用将是:

$.ajax({
        url : '/user/ajax/getAvailableSUsforGenericKey.htm',
        data : 'scratchCardNumber ='+value,
        type : 'POST',
        async: false,
        dataType: 'text',
        success : function(data) {

            var json=JSON.parse(data);
            var jsonlist = json.allSU;
            var su_array = [];
            for(var i=0; i < jsonlist.length; i++){
                var x=jsonlist[0].split(',')[1].split(': ')[1];
                su_array.push(x);
            }
            su_list =su_array.toString();

                },
        error: function (data) {
            $('#actionMessage').html("<p style='color: red'>cannot load the email - contact tech team please!</p>");}


        });

此Ajax调用之后的代码将在您的成功函数完成后执行。我个人不建议这样做,因为浏览器将一直挂起,直到Ajax请求完成。

答案 1 :(得分:0)

Ajax请求是异步的。这意味着它们不是按顺序调用的。这里发生的事情是,您首先调用的请求在另一个之前完成。看一下回调模式,试着去理解它。然后,您可以了解为执行异步操作提供更清晰API的promises,然后最终继续执行async await,它是内部使用Promises的新ecmascript规范的一部分。

答案 2 :(得分:-1)

如果我正确理解了您的问题,则在该if块中的其余代码之后执行AJAX调用。发生这种情况是因为ajax请求不是即时的,一旦请求被发送出去,程序就会继续下一步。如果您需要ajax请求下面的代码,只有在有响应之后运行,那么您需要将该代码放在“success”函数中。