2016-08-22 2 views
0

У меня возникают проблемы с получением переменной из запроса 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() делает работу и заполняет таблицу.

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

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

ответ

1

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

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

Пробовал, но не повезло, я боюсь .. :-( – CostCare

+0

На самом деле, я думаю, вы ничего не возвращаете из своих методов. GetPcLatitude() и getPcLongitude(), потому что оператор return находится внутри функции(), поэтому он связан с внутренней функцией. Вы можете попробовать: верните jqxhr.responseText в конце, но снова помните, что он асинхронный. –

1

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

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

function getPcLatitude(callback) { 
... 
} 

function getPcLongitude(callback) { 
... 
} 

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

callback(parseFloat(myLatitude)); 

callback(parseFloat(myLongitude)); 

И ваша последняя функция будет somehting так:

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

} 

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

0

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

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

Смежные вопросы