2012-04-30 1 views
0

JavaScriptで関数を実行しようとしていますが、他のすべての関数を実行して終了する必要があります。私はそれが他の機能の避難所以降はNaNを返しますgetAverage機能を実行するたびに他のファイヤー関数の後にJavaScriptを完了

 getWeather(); 
     getAverage(); 


function getWeather() { 
    $.getJSON("http://where.yahooapis.com/geocode?q=" + lat + ",+" + lon + "&gflags=R&flags=J", function(data){ 
     zipCode = data.ResultSet.Results[0].postal; 
     zipCode = zipCode.substring(0,5); 
     WOEID = data.ResultSet.Results[0].woeid; 
     getYahooWeather(WOEID); 
     getWeatherbug(zipCode); 
     getWeatherUnderground(zipCode); 
     getWorldWeather(zipCode); 
    }); 
} 

function getYahooWeather(x) { 
    var query = escape('select item from weather.forecast where woeid="'+x+'"'); 
    var url = "http://query.yahooapis.com/v1/public/yql?q=" + query + "&format=json"; 


    $.getJSON(url, function(data2){ 
     yahooTemp = data2.query.results.channel.item.condition.temp; 
     $("#yahoo-weather p").replaceWith("<p>Weather from Yahoo! powered by The Weather Channel = "+yahooTemp+"&deg;F</p>"); 
    }); 
} 

function getWeatherbug(x) { 
    var url = "http://i.wxbug.net/REST/Direct/GetObs.ashx?api_key="+ weatherbugAPI + "&zip="+x+"&ht=t&ic=1&f=?"; 
    console.log(url); 

    $.ajax({ 
     url: url, 
     dataType: "jsonp", 
     success: function(data3) { 
      //console.log(data3.temperature); 
      wbTemp = data3.temperature; 
      $("#wb-weather p").replaceWith("<p>Weather from WeatherBug = "+wbTemp+"&deg;F</p>"); 
     } 
    }); 
} 

function getWeatherUnderground(x) { 
    $.ajax({ 
    url: "http://api.wunderground.com/api/b87325296cd69fa8/geolookup/conditions/q/IA/"+x+".json", 
    dataType: "jsonp", 
    success: function(parsed_json) { 
     var location = parsed_json['location']['city']; 
     wuTemp = parsed_json['current_observation']['temp_f']; 
     $("#wu-weather p").replaceWith("<p>Weather from Weather Underground = "+wuTemp+"&deg;F</p>"); 
     } 
    }); 
} 

function getWorldWeather(x) { 
    var url = "http://free.worldweatheronline.com/feed/weather.ashx?key="+wwKey+"&q="+x+"&fx=no&format=json"; 

    $.ajax({ 
     url: url, 
     dataType: "jsonp", 
     success: function(data6) { 
      wwTemp = data6.data.current_condition[0].temp_F; 
      $("#ww-weather p").replaceWith("<p>Weather from World Weather Online = "+wwTemp+"&deg;F</p>"); 
     } 
    }); 
} 

function getAverage() { 
    avTemp = wbTemp + wwTemp + yahooTemp + wuTemp; 
    console.log(avTemp); 
} 

私が午前問題は次のとおりです。ここで(申し訳ありませんが、私はそれは長い間知っているが、その唯一の方法は、私は何が起こっているかを説明することができます)のコードです彼らのデータはまだ返されていません。

以前のすべての関数がデータを返した後に関数を実行する方法はありますか?

おかげ

+0

getWorldWeather(zipCode)の直後にコールが移動するだけではありません。作業? – ccKep

答えて

3

https://github.com/caolan/asyncにあるasyncのような非同期ライブラリを使用するのが簡単な方法の1つです。 parallel関数を使用してゲッターを並行して実行し、すべてが終了したときに戻ることができます。コードは次のようになります。

async.parallel([ 
    function(callback){ 
     setTimeout(function(){ 
      callback(null, 'one'); 
     }, 200); 
    }, 
    function(callback){ 
     setTimeout(function(){ 
      callback(null, 'two'); 
     }, 100); 
    }, 
], 
// optional callback 
function(err, results){ 
    // the results array will equal ['one','two'] even though 
    // the second function had a shorter timeout. 
}); 

もう1つの方法は、待機中のコールバックの数を含むグローバル変数を持つことです。その後、各天気ゲッターのコールバックで、カウンターを減らします。平均をとる前に、カウンターが0になるまで待ってください(setTimeoutを使用して一定時間待ってから再度チェックしてください)。

+0

これを試してみます。ありがとう! – Vinny

1

はそれを短くするには:あなたがgetWorldWeather(zipCode);を呼び出した直後、すなわち、getJSONコールバック内からgetAverageを呼び出します。

+0

Ajax呼び出しが最初に返されるかどうかを判断する方法がないため、これが機能するとは思われません。 getWorldWeatherが最初に返された場合、平均値は正しくありません。 – Bill

+0

@Bill、あなたは絶対に正しいです!あなたの答えは正しいものです。 – bfavaretto

0

確かにあります。メソッドを渡すことやコールバックを行う必要があります。 http://jsfiddle.net/UDbeV/

は私がより詳細にそれを説明しましょう。ここでは

は、あなたがそれについて移動する方法を上未テスト例です。

var i = 0; 
loopCount = function() { 
    i++; 
    if (i > 5) { 
     getAverage(); 
    } 
}); 

したがって、カウンタを格納するloopCountという関数を作成しています。毎回その呼ばれ、我々は1

によって、そのカウンタをインクリメントあなたの方法にコールバックを渡すことができます:

getYahooWeather(WOEID, callback); 
    getWeatherbug(zipCode, callback); 
    getWeatherUnderground(zipCode, callback); 
    getWorldWeather(zipCode, callback); 
    callback(); 

今、私たちは二番目のパラメータを許可するように機能を変更する必要があります。

function getYahooWeather(x, callback) { ... 

最後に、各ブロックの最後に、それを呼びたいとします:

$.getJSON(url, function(data2) { 
    yahooTemp = data2.query.results.channel.item.condition.temp; 
    $("#yahoo-weather p").replaceWith("<p>Weather from Yahoo! powered by The Weather Channel = " + yahooTemp + "&deg;F</p>"); 
    callback(); 
}); 

コールバック(つまり、平均よりも前にやっている呼び出しの数から)getAverage()を呼び出します。

もっと効率的な方法がありますが、それは月曜日です:Pまた、テストされていないので、もしかするとちょっとハックする必要があります。 :o)