AJAX对功能的响应(防止异步false)

时间:2019-06-13 11:50:06

标签: javascript ajax

我对AJAX调用有疑问,无法将响应提供给主函数。现在,我使用异步false,我知道这很奇怪,我尝试解决它,但始终失败。

这有效(异步为false):

function printTable(){
    var $table = $('#Table');

    var view_data;

    $.ajax({
        type: "GET",
        url: '/api/getdata',
        success: function(response) {

        var TableData = [];

        for(var i =0;i < response.length ;i++){
                    var item = response[i];

        var sessionID = item.sessionID;

                    if(sessionID){

                        $.ajax({
                        async: false,
                        type: "POST",
                        url: '/api/getNickname',
                        dataType: "json",
                        data: {
                        id: sessionID,
                        },
                        success: function(response){
                            view_data = response;
                        }
                     });

}

TableData.push({
                        _id: item._id,
                        datum: item.datum,
                        uhrzeit: item.uhrzeit,
                        session: view_data,
                        });

        }

        $table.bootstrapTable({data: TableData});
        $table.bootstrapTable('togglePagination');
            }   
    })
}

我从这里尝试了建议:Assigning ajax response to global variable without using async: false,但是由于view_data未定义,所以它失败了。

function printTable(){
    var $table = $('#Table');

    var view_data;

    $.ajax({
        type: "GET",
        url: '/api/getdata',
        success: function(response) {

        var TableData = [];

        for(var i =0;i < response.length ;i++){
                    var item = response[i];

        var sessionID = item.sessionID;

                    if(sessionID){

                    $.ajax({
                    type: "POST",
                    url: '/api/getNickname',
                    dataType: "json",
                    data: {
                    id: sessionID,
                    }
                 }).done(function(response){
                    test(response)
                 });

                 function test(response){
                     view_data = response;
                     return view_data;
                 }

            }

}

TableData.push({
                        _id: item._id,
                        datum: item.datum,
                        uhrzeit: item.uhrzeit,
                        session: view_data,
                        });

        }

        $table.bootstrapTable({data: TableData});
        $table.bootstrapTable('togglePagination');
            }   
    })
}

我意识到的是如果我放了alert(view_data);在推送之前有效!?我对JS / AJAX的了解还不是那么深入,所以我希望有人可以给我提示或帮助。 如何在不使用异步false的情况下将var view_data传递给主函数?

谢谢...

2 个答案:

答案 0 :(得分:0)

这与异步代码有关

当您指定async: false时,就是在告诉代码等待,直到此HTTP调用完成。

但是如果没有async: false,您的http调用将被异步进行,即程序将继续执行,而无需实际等待HTTP调用完成,并且您的success函数仅在HTTP时执行返回呼叫响应 这将需要2 3秒钟,但是您正在访问当时未定义的view_data。

您可以做的是将push代码移到success函数中:

函数printTable(){     var $ table = $('#Table');

var view_data;

$.ajax({
    type: "GET",
    url: '/api/getdata',
    success: function(response) {

    var TableData = [];

    for(var i =0;i < response.length ;i++){
                var item = response[i];

    var sessionID = item.sessionID;

                if(sessionID){

                    $.ajax({
                    async: false,
                    type: "POST",
                    url: '/api/getNickname',
                    dataType: "json",
                    data: {
                    id: sessionID,
                    },
                    success: function(response){
                        view_data = response;
                        TableData.push({  // <- like this
                    _id: item._id,
                    datum: item.datum,
                    uhrzeit: item.uhrzeit,
                    session: view_data,
                    });
                   $table.bootstrapTable({data: TableData});
                   $table.bootstrapTable('togglePagination');


                    }
                 });

}

    }

        }   
})

}

答案 1 :(得分:0)

这是JS异步时的情况,因此,当您使用async:false时,意味着下面的代码直到得到响应后才执行。 声明变量(view_data)->异步发送AJAX请求(您不等待响应)->摘录以下代码

声明变量(view_data)->同步发送AJAX请求(您等待响应)->分配对view_data的响应->摘录以下代码

所以您在ajax请求执行后将j查询写入成功并得到响应

function printCatchTable() {
    var $table = $("#TableLastCaught");

    $.ajax({
        type: "GET",
        url: "/api/lastcaught",
        success: function(response) {
            var faengeTableData = [];

            for (var i = 0; i < response.length; i++) {
                var item = response[i];

                var sessionID = item.sessionID;

                if (sessionID) {
                    $.ajax({
                        type: "POST",
                        url: "/api/getSessionNickname",
                        dataType: "json",
                        data: {
                            id: sessionID
                        },
                        success: function(response) {
                            //Keep Pushing on Array
                            faengeTableData.push({
                                _id: item._id,
                                datum: item.datum,
                                uhrzeit: item.uhrzeit,
                                fischart: item.fischart,
                                gewicht: item.gewicht,
                                laenge: item.laenge,
                                koeder: item.koeder,
                                montage: item.montage,
                                gewaesser: item.gewaesser,
                                temperatur: item.temperatur,
                                luftdruck: item.luftdruck,
                                bilder: fileNames,
                                edit: item._id,
                                session: response
                            });

                            //run jquery on last element
                            if(i === response.length){//if i === response.length, it means its final element so you run jquery table
                                $table.bootstrapTable({ data: faengeTableData });
                                $table.bootstrapTable("togglePagination");
                            }
                        }
                    });
                }


            }
        }
    });
}