Проблемы с хранением запроса getjson в переменной

У меня проблемы с получением переменной из getJSON() запрос. У меня есть следующие три функции:

function getPcLatitude() { // onchange

    var funcid = "get_postcode_latitude";
    var postcode = parseInt($('#input-field-postcode').val());

    var jqxhr = $.getJSON('functions/getdata.php', {

        "funcid":funcid,
        "postcode":postcode}).done(function(dataLatitude) {

            if (dataLatitude == null) {
                //..
            } else {
                var myLatitude = 0;
                for (var i=0;i<dataLatitude.length;i++){
                   myLatitude = dataLatitude[i].pc_latitude;
                }
                return parseFloat(myLatitude);
                //alert(myLatitude);
            }

        });
}

function getPcLongitude() { // onchange

    var funcid = "get_postcode_longitude";
    var postcode = parseInt($('#input-field-postcode').val());

    var jqxhr = $.getJSON('functions/getdata.php', {

        "funcid":funcid,
        "postcode":postcode}).done(function(dataLongitude) {

            if (dataLongitude == null) {
                //..
            } else {
                var myLongitude = 0;
                for (var i=0;i<dataLongitude.length;i++){
                   myLongitude = dataLongitude[i].pc_longitude;
                }
                return parseFloat(myLongitude);
                //alert(myLongitude);
            }

        });
}

function getTop5Postcode() { // onchange

    setTimeout(function() {

        var funcid = "get_top_5_postcode";
        var er = rangeM3Slider.noUiSlider.get();
        var zv = $("#selectzv").val();
        if (zv < 1) {
            var zv = $("#selectzvfc").val();
        }
        var zp = $("#selectzp").val();
        if (zp < 1) {
            var zp = $("#selectzpfc").val();
        }
        var latitude = getPcLatitude();
        var longitude = getPcLongitude();
        var chosendistance = parseInt($('#input-field-afstand').val());

        var jqxhr = $.getJSON('functions/getdata.php', {
            "funcid":funcid,
            "er":er,
            "zp":zp,
            "zv":zv,
            "latitude":latitude,
            "longitude":longitude,
            "chosendistance":chosendistance}).done(function(dataPrices) {

                if (dataPrices == null) {
                    $('#myModalAlert').modal('show');
                } else {

                    //$('#myModalData').modal('show');
                    var table = '';
                    var iconClassZkn = '';
                    var iconClassIp = '';
                    for (var i=0;i<dataPrices.length;i++){
                       if (dataPrices[i].zkn_score == 0) {
                            iconClassZkn = 'no-score';
                       } else {
                            iconClassZkn = 'zkn-score';
                       }
                       if (dataPrices[i].ip_score == 0) {
                            iconClassIp = 'no-score';
                       } else {
                            iconClassIp = 'ip-score';
                       }
                       table += '<tr>'
                       + '<td width="75" class="zkh-image" align="center">'+ dataPrices[i].zvln_icon +'</td>'
                       + '<td width="250" align="left"><b>'+ dataPrices[i].zvln +'</b><br><i>Locatie: ' + dataPrices[i].zvln_city + '</i></td>'
                       + '<td class=text-center> € '+ dataPrices[i].tarif +'</td>'
                       + '<td class=text-center> € '+ dataPrices[i].risico +'</td>'
                       + '<td class=text-center><a target="_blank" href="' + dataPrices[i].zkn_url + '"><span class="' + iconClassZkn + '"><font size="2"><b>' + dataPrices[i].zkn_score + '</b></font></span></a></td>'
                       + '<td class=text-center><a target="_blank" href="' + dataPrices[i].ip_url + '"><span class="' + iconClassIp + '"><font size="2"><b>' + dataPrices[i].ip_score + '</b></font></span></a></td>'
                       + '</tr>';   
                    }
                    $('#top5').html(table);
                    //$('#myModalData').modal('hide');
                  }
            })
            .fail(function() { $('#myModalAlert').modal('show');}); //When getJSON request fails
    }, 0);

}

Сформировать причину

var latitude = getPcLatitude();
var longitude = getPcLongitude();

части не работают / не получают значения из функций. Когда я изменяю возврат в обеих функциях в alert() это дает мне ожидаемые значения, так что эти две функции работают.

Когда я устанавливаю две переменные напрямую, вот так:

var latitude = 5215;
var longitude = 538;

тогда getTop5Postcode() Функция работает и заполняет таблицу.

Любая помощь в этом?

С уважением, Барт

3 ответа

Обе ваши функции (getPcLatitude и getPcLongitude) ничего не возвращают, потому что оператор return находится внутри обратного вызова из асинхронного запроса, и поэтому предупреждение показывает правильное значение.

Я бы предложил вам изменить подпись обоих методов, добавив параметр обратного вызова.

function getPcLatitude(callback) {
...
}

function getPcLongitude(callback) {
...
}

И вместо возврата вы должны передать значение в обратный вызов:

callback(parseFloat(myLatitude));

callback(parseFloat(myLongitude));

И ваша последняя функция будет выглядеть примерно так:

function getTop5Postcode() { // onchange

setTimeout(function() {

    var latitude;
    var longitude;

    getPcLatitude(function(lat) {
        latitude = lat;
        getTop5(); // Here you call the next function because you can't be sure what response will come first.
    });

    getPcLongitude(function(longi) {
        longitude = longi;
        getTop5();
    });



    function getTop5() {

        if (!latitude || !longitude) {
            return; // This function won't continue if some of the values are undefined, null, false, empty or 0. You may want to change that.
        }

        var funcid = "get_top_5_postcode";
        var er = rangeM3Slider.noUiSlider.get();
        var zv = $("#selectzv").val();
        if (zv < 1) {
            var zv = $("#selectzvfc").val();
        }
        var zp = $("#selectzp").val();
        if (zp < 1) {
            var zp = $("#selectzpfc").val();
        }

        var chosendistance = parseInt($('#input-field-afstand').val());

        var jqxhr = $.getJSON('functions/getdata.php', {
            "funcid":funcid,
            "er":er,
            "zp":zp,
            "zv":zv,
            "latitude":latitude,
            "longitude":longitude,
            "chosendistance":chosendistance}).done(function(dataPrices) {

                if (dataPrices == null) {
                    $('#myModalAlert').modal('show');
                } else {

                    //$('#myModalData').modal('show');
                    var table = '';
                    var iconClassZkn = '';
                    var iconClassIp = '';
                    for (var i=0;i<dataPrices.length;i++){
                    if (dataPrices[i].zkn_score == 0) {
                            iconClassZkn = 'no-score';
                    } else {
                            iconClassZkn = 'zkn-score';
                    }
                    if (dataPrices[i].ip_score == 0) {
                            iconClassIp = 'no-score';
                    } else {
                            iconClassIp = 'ip-score';
                    }
                    table += '<tr>'
                    + '<td width="75" class="zkh-image" align="center">'+ dataPrices[i].zvln_icon +'</td>'
                    + '<td width="250" align="left"><b>'+ dataPrices[i].zvln +'</b><br><i>Locatie: ' + dataPrices[i].zvln_city + '</i></td>'
                    + '<td class=text-center> € '+ dataPrices[i].tarif +'</td>'
                    + '<td class=text-center> € '+ dataPrices[i].risico +'</td>'
                    + '<td class=text-center><a target="_blank" href="' + dataPrices[i].zkn_url + '"><span class="' + iconClassZkn + '"><font size="2"><b>' + dataPrices[i].zkn_score + '</b></font></span></a></td>'
                    + '<td class=text-center><a target="_blank" href="' + dataPrices[i].ip_url + '"><span class="' + iconClassIp + '"><font size="2"><b>' + dataPrices[i].ip_score + '</b></font></span></a></td>'
                    + '</tr>';   
                    }
                    $('#top5').html(table);
                    //$('#myModalData').modal('hide');
                }
            })
            .fail(function() { $('#myModalAlert').modal('show');}); //When getJSON request fails
    }


}, 0);

}

Конечно, это далеко от идеального решения вашей проблемы, но оно должно работать! И я не тестировал этот код.

Не забывайте, что JavaScript является асинхронным, поэтому к тому времени, когда вы достигнете оператора return, запрос, вероятно, еще не выполнен. Вы можете использовать обещание, что-то вроде:

 $.getJSON(....).then(function(value){//do what you want to do here})

Я решил это, сделав некоторые дополнительные вещи в запросах MySQL. Теперь мне осталось использовать только основную функцию.

Вещи работают сейчас! Спасибо за помощь!

Другие вопросы по тегам