在变量中存储getjson请求的问题

时间:2016-08-22 17:01:40

标签: javascript 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 个答案:

答案 0 :(得分:1)

不要忘记JavaScript是异步的,所以当你到达return语句时,请求可能还没有完成。您可以使用承诺,例如:

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

答案 1 :(得分:1)

你的函数(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);

}

当然,这远不是您问题的完美解决方案,但它应该有效! 我没有测试这段代码。

答案 2 :(得分:0)

我通过在mysql查询中做一些额外的事情来解决这个问题。现在我只需要使用main函数。

事情现在奏效!谢谢你的帮助!