2013-11-21 32 views
0

在以下腳本中,儘管兩個天氣對象都使用ajax調用中的數據填充,但updateWeather調用在該行執行之前將它們顯示爲未定義。我移動了變量聲明,使它們成爲全局變量,但在updateWeather調用之前它們仍然顯示未定義。我錯過了什麼?我可以不在ajax成功函數中設置一個變量,然後再傳遞它嗎? 注:如果你要測試的這款使用不同的URL,因爲這一個不會爲你出我的憑據工作已填充的jquery對象在傳遞時顯示爲undefined

function getWeatherForecastStationCode() { 
var d = new Date(); 
var parts = d.toString().split(" "); 
var dDate = parts[1] + " " + parts[2] + ", " + parts[3]; 
var ampm; 
if (parts[4].split(":")[0] <= 12) { 
    ampm = "AM"; 
} else { 
    ampm = "PM"; 
} 
var dtime = parts[4].split(":")[0] + ":" + parts[4].split(":")[1]; 
var datetime = dDate + " " + dtime + ampm; 
alert(datetime); 
var weatherStation = "KPBI"; // get from GetWeatherService.svc 
var forecastFields = "&fields=periods.maxTempF%2cperiods.minTempF%2cperiods.vaildTime%2cperiods.weather%2cperiods.icon"; 
var currentFields = "&fields=ob.tempC%2cob.tempF%2cob.icon%2cplace.name%2cplace.state"; 
var forecastUrlWeatherStation = 'http://api.aerisapi.com/forecasts/' + weatherStation + '?limit=1&client_id=' + AerisClientId + '&client_secret=' + AerisWeatherApiSecret + forecastFields; 
var currentUrlWeatherStation = 'http://api.aerisapi.com/observations/' + weatherStation + '?limit=1&client_id=' + AerisClientId + '&client_secret=' + AerisWeatherApiSecret + currentFields; 


$.ajax({ 
    type: "GET", 
    url: forecastUrlWeatherStation, 
    dataType: "json", 
    success: function (json) { 
     if (json.success === true) { 
      forecastedWeather = { 
       weather: json.response[0].periods[0].weather, 
       maxTemp: json.response[0].periods[0].maxTempF, 
       minTemp: json.response[0].periods[0].minTempF, 
       weatherIcon: json.response[0].periods[0].icon, 
       obsTime: datetime 
      }; 
     } 
     else { 
      alert('An error occurred: ' + json.error.description); 
     } 
    } 
}); 
var location; 
$.ajax({ 
    type: "GET", 
    url: currentUrlWeatherStation, 
    dataType: "json", 
    success: function (json) { 
     if (json.success === true) { 
      var place = json.response.place.name.split(" "); 
      if (place.length === 1) { 
       location = place[0].charAt(0).toUpperCase() + place[0].substr(1, place[0].length); 
      } else { 
       location = place[0].charAt(0).toUpperCase() + place[0].substr(1, place[0].length) + " " + place[1].charAt(0).toUpperCase() + place[1].substr(1, place[1].length) + ", " + json.response.place.state.toUpperCase(); 
      } 
      currentWeather = { 
       location: location, 
       currentTemp: json.response.ob.tempF 
      }; 
     } else { 
      alert('An error occurred: ' + json.error.description); 
     } 
    } 
}); 
updateWeather(forecastedWeather,currentWeather); 
} 

回答

1

的問題是,AJAX異步是(多數民衆贊成在「A」在「AJAX」中),因此在從您的2個Ajax調用收到響應之前,正在執行對updateWeather的調用。

然後執行此操作的方法是在致電updateWeather之前等待所有ajax調用完成。

像下面這樣(未經):

$.when(getForecast(),getCurrent()).done(function(f,c){ 
    updateWeather(forecastedWeather,currentWeather) 
}); 

function getForecast(){ 
    return $.ajax({ 
    type: "GET", 
    url: forecastUrlWeatherStation, 
    dataType: "json" 
    .... 
    }); 
}; 

function getCurrent(){ 
    return $.ajax({ 
    type: "GET", 
    url: currentUrlWeatherStation, 
    dataType: "json" 
    .... 
    }); 
}; 
+0

咄,大一點,我將承諾落實 – dinotom

相關問題