var selects = document.querySelector('.selects'); var weatherDiv = document.querySelector('.weather'); function get(url){ return new Promise(function(resolve,reject){ var xhr = new XMLHttpRequest(); xhr.open('GET',url,true); xhr.onload = function(){ if(xhr.status == 200){ resolve(JSON.parse(xhr.responseText)); } else{ reject(xhr.statusText); } } xhr.onerror = function(){ reject('not found'); } xhr.send(); }); } function show(obj){ var weather = obj.query.results.channel.item.description; var resWeather = weather.replace(/href|CDATA|[\!]|[\[]|[\]]/g,""); var resWeather2 = resWeather.slice(1,resWeather.length - 1); var resWeather3 = resWeather2.replace(/Full Forecast at Yahoo Weather/g,""); var resWeather4 = resWeather3.slice(0,resWeather3.length - 28); weatherDiv.innerHTML = resWeather4; } function* myGenerator(){ try{ var object = yield get('https://raw.githubusercontent.com/David-Haim/CountriesToCitiesJSON/master/countriesToCities.json'); var keys = Object.keys(object); var select = document.createElement("select"); for (var i = 0; i < keys.length; i++) { var option = document.createElement("option"); option.innerHTML = keys[i]; option.value = keys[i]; select.appendChild(option); } select.onchange = function(){ run(onchange1); } function* onchange1(){ try{ var mainSelect = document.getElementById("main") var select = document.createElement("select"); for (var i = 0; i < object[mainSelect.value].length; i++) { var option = document.createElement("option") option.innerHTML = object[mainSelect.value][i]; select.appendChild(option); } if(selects.children.length > 1){ selects.replaceChild(select,mainSelect.nextElementSibling); } else selects.appendChild(select); var obj = yield get("https://query.yahooapis.com/v1/public/yql?" + 'q=' + encodeURIComponent("select * from weather.forecast where woeid in (select woeid from geo.places(1) where text=\'" + select.value + "\') and u='c'") + '&format=json'); show(obj); select.onchange = function(){ run(onchange2); } function* onchange2(){ try{ var obj2 = yield get("https://query.yahooapis.com/v1/public/yql?" + 'q=' + encodeURIComponent("select * from weather.forecast where woeid in (select woeid from geo.places(1) where text=\'" + select.value + "\') and u='c'") + '&format=json'); show(obj2); }catch(error){ throw error; } } }catch(error){ throw error; } } selects.appendChild(select); select.id = "main"; }catch(error){ throw error; } } function run(g){ var gen = g(); function handle(result){ if(!result.done){ result.value.then(function(data){ handle(gen.next(data)); }).catch(function(error){ throw(error); handle(gen.next()); }) } } handle(gen.next()); } run(myGenerator);