Первый звонок:
$("#city-loading").empty().html('<img src="/Images/loading.gif" />');
- это вызов ajax, поскольку выполнение асинхронного кода будет продолжено и будет выполняться так:
$("#city-loading").empty();
Вы должны скрыть изображение в обратном вызове ajax:
function updateCityList(state) {
$("#city-loading").empty().html('<img src="/Images/loading.gif" />');
$.ajax(
{
type: "GET",
async: true,
url: "/NPA/GetCities/" + state,
dataType: "json",
success: function(optionData) {
$("#city-loading").empty();
var options = [];
$(optionData).each(function(index, optionData) {
if ($('#cities option[value=' + optionData.Value + ']').length == 0)
options.push(optionData);
});
$("#cityList").fillSelect(options);
}
});
};