Ответ AJAX на функцию (предотвратить асинхронное ложное) - PullRequest
0 голосов
/ 13 июня 2019

У меня проблема с вызовом AJAX для ответа на основную функцию.Прямо сейчас я использую async 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');
            }   
    })
}

Я попробовал следующее предложение: Присвоение ответа ajax глобальной переменной без использования 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');
            }   
    })
}

То, что я понял, это если я поставлю оповещение (view_data);до толчка это работает !?Я не настолько глубоко в JS / AJAX, как все еще изучаю его, поэтому я надеюсь, что кто-то может дать мне подсказку или может помочь .. Как я могу передать var view_data в основную функцию, не используя async false?

Спасибо...

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Вот что происходит, когда JS работает асинхронно, поэтому, когда вы используете async: false, это означает, что код, приведенный ниже, не будет выполняться, пока вы не получите ответ.Объявить переменную (view_data) -> асинхронно отправить AJAX-запрос (вы не ждете ответа) -> приведенный ниже код

Объявить переменную (view_data) -> синхронно отправить AJAX-запрос (вы ждете ответа) -> назначить ответto view_data -> приведенный ниже код исполняется

, поэтому вы успешно пишете свой j-запрос после выполнения ajax-запроса и получаете ответ

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");
                            }
                        }
                    });
                }


            }
        }
    });
}

0 голосов
/ 13 июня 2019

Это связано с асинхронным кодом

Когда вы указываете async: false, вы сообщаете коду ждать , пока этот HTTP-вызов не будет завершен.

Но без async: false ваш http-вызов выполняется асинхронно , т. Е. Программа продолжит свое выполнение без фактического ожидания завершения HTTP-вызова, а ваша success функция будет выполняться только тогда, когда ответ на HTTP-вызоввозвращается, что займет 2 3 секунды, но вы получаете доступ к вашим view_data, который в то время не определен.

Что вы можете сделать, это переместить свой код push в функцию success:

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({  // <- like this
                    _id: item._id,
                    datum: item.datum,
                    uhrzeit: item.uhrzeit,
                    session: view_data,
                    });
                   $table.bootstrapTable({data: TableData});
                   $table.bootstrapTable('togglePagination');


                    }
                 });

}

    }

        }   
})

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...