2016-05-19 6 views
0

У меня есть интерфейс, который нужен пользователю для ввода почтового индекса, затем я буду запрашивать долготу и широту с удаленного сайта на основе введенного почтового индекса, а затем запрашивать некоторую информацию о населении на основе предыдущей запрашиваемой долготы и широты. Мне нужно 3 XMLhttpRequest() для запроса трех разных сайтов. Каждый запрос будет основываться на предыдущих запрошенных данных. Я думаю, что в моем коде могут быть проблемы с обратным вызовом, я не знаю, как это исправить.XMLHttpRequest с несколькими запросами

<input type="submit" value="Get City" onclick="getInfo()"> 

    <script> 
    function getInfo(getGeoCode) { 
     var zipCode = document.getElementById("inputtext").value 

     var xmlReq = new XMLHttpRequest(); 
     xmlReq.open("GET", "http://api.zippopotam.us/us/" + zipCode, true); 
     xmlReq.onreadystatechange = function() { 
      if (xmlReq.readyState == 4) { 
       var temp = JSON.parse(xmlReq.responseText); 
       var lat = temp.places[[0]].latitude ; 
       var logt = temp.places[[0]].longitude; 
       getGeoCode(lat, logt); 
      }; 
     }; 

     xmlReq.send(); 
    } 

    function getGeoCode(lat,logt,getpop) { 
     var nereq = new XMLHttpRequest(); 
     nereq.open("GET", "https://data.fcc.gov/api/block/find?&latitude=" + lat + "&longitude=" + logt + "&showall=false&format=json", true); 
     nereq.onreadystatechange = function() { 
      if (nereq.readyState == 4) { 
       var temp2 = JSON.parse(nereq.responseText); 
       var stateCode = temp2.State.FIPS; 
       var contyCode = temp2.County.FIPS; 
       getpop(stateCode, contyCode); 
      }; 
     }; 
     nereq.send(); 
    } 

    function getpop(stateCode, contyCode) { 
     var nereq2 = new XMLHttpRequest(); 
     nereq2.open("GET", "http://api.census.gov/data/2010/sf1?get=P0010001&for=county:" + contyCode + "&in=state:" + stateCode, true); 
     nereq2.onreadystatechange = function() { 
      if (nereq2.readyState == 4) { 
       var temp3 = JSON.parse(nereq.responseText); 
       document.getElementById("fs").innerHTML = temp3; 
      }; 
     }; 
     nereq2.send(); 
    } 
</script> 
+0

Вы не проходящих третьего аргумента в 'getGeoCode' .. Просто используйте' функцию getGeoCode (латы, logt) 'поскольку' getpop' находится в глобальном контексте .. Вы не можете вызывать 'undefined' – Rayon

+0

Взгляните на Promises и [fetch api] (https://developer.mozilla.org/en/docs/Web/API/Fetch_API) –

ответ

0

Ваши функции имеют аргументы, которые конфликтуют с именами функций, которые вы вызываете, поэтому они больше не доступны.

Например, getGeoCode имеет аргумент getpop. Когда вызывается getpop, он не вызывает функцию этого имени, но пытается вызвать ссылку, ссылающуюся на аргумент getpop. Тем более, что вы не проходите ничего в этом paarmeter, это, скорее всего, ошибка.

Решения просто удалить параметр getGeoCode из getInfo() и параметра getpop от getGeoCode():

<input type="submit" value="Get City" onclick="getInfo()"> 

    <script> 
    function getInfo() { 
     var zipCode = document.getElementById("inputtext").value 

     var xmlReq = new XMLHttpRequest(); 
     xmlReq.open("GET", "http://api.zippopotam.us/us/" + zipCode, true); 
     xmlReq.onreadystatechange = function() { 
      if (xmlReq.readyState == 4) { 
       var temp = JSON.parse(xmlReq.responseText); 
       var lat = temp.places[[0]].latitude ; 
       var logt = temp.places[[0]].longitude; 
       getGeoCode(lat, logt); 
      }; 
     }; 

     xmlReq.send(); 
    } 

    function getGeoCode(lat,logt) { 
     var nereq = new XMLHttpRequest(); 
     nereq.open("GET", "https://data.fcc.gov/api/block/find?&latitude=" + lat + "&longitude=" + logt + "&showall=false&format=json", true); 
     nereq.onreadystatechange = function() { 
      if (nereq.readyState == 4) { 
       var temp2 = JSON.parse(nereq.responseText); 
       var stateCode = temp2.State.FIPS; 
       var contyCode = temp2.County.FIPS; 
       getpop(stateCode, contyCode); 
      }; 
     }; 
     nereq.send(); 
    } 

    function getpop(stateCode, contyCode) { 
     var nereq2 = new XMLHttpRequest(); 
     nereq2.open("GET", "http://api.census.gov/data/2010/sf1?get=P0010001&for=county:" + contyCode + "&in=state:" + stateCode, true); 
     nereq2.onreadystatechange = function() { 
      if (nereq2.readyState == 4) { 
       var temp3 = JSON.parse(nereq.responseText); 
       document.getElementById("fs").innerHTML = temp3; 
      }; 
     }; 
     nereq2.send(); 
    } 
</script> 
+0

Но вопрос в том, когда я отлаживаю в var temp2 = JSON.parse (nereq.responseText); он дает мне ошибку времени выполнения – user3491987

+0

, а затем, пожалуйста, отредактируйте вопрос, чтобы указать детали ошибки и данные ответа. Из вашего комментария это звучит так, как ответ, который вы получаете с сервера, недействителен JSON, но без подробностей, это просто гадание – Rhumborl

+0

Да, может быть, что-то не так с API, я проверю это ... Спасибо – user3491987

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