Возврат строки в Javascript

Я пытаюсь создать простую функцию, которая возвращает правильную строку при вызове:

function getState(abbr){
   if (abbr=="WY")
   {
   return "Wyoming";
   }
}

и тогда вызов такой:

var stateName = getState("WY");

однако все, что возвращается, это: 0

Извините, если я пропустил что-то очевидное.

UPDATE-мой orig prob был из-за "&" вот реальный код, с которым я имею дело:

function getState(abbr){
    var url = "states.asp"
    var state = ""; 
    $.get(url, function(data) {
        var i = 0;
        $.each($('state',data),function(index, el) {            
            if (abbr == ($(this).attr("abbr"))){
                //alert($(this).attr("abbr"));
                state = $(this).text();
            }//if (abbr == $(this).attr("abbr")){
        });//$.each($('state',data),function(index, el) {
    }).success(function() { 
        alert("x" + state);
        return state;
    }); //.success(function() { 
    //$.get(url, function(data) {
    alert("y" + state); 
    return state;
}

я получаю "неопределенный" в результате моего вызова:

alert(getState("WY"));

Alert ("x" + состояние) работает.

обновление #2 --- вот все, что говорится.asp генерирует (на данный момент)... позже он вернет компании и т. д.:

<?xml version="1.0" encoding="utf-8"?>
<STATELIST>
<STATE abbr="AL">Alabama</STATE>
<STATE abbr="AK">Alaska</STATE>
<STATE abbr="AZ">Arizona</STATE>
<STATE abbr="AR">Arkansas</STATE>
<STATE abbr="CA">California</STATE>
<STATE abbr="CO">Colorado</STATE>
<STATE abbr="CT">Connecticut</STATE>
<STATE abbr="DE">Delaware</STATE>
<STATE abbr="FL">Florida</STATE>
<STATE abbr="GA">Georgia</STATE>
<STATE abbr="HI">Hawaii</STATE>
<STATE abbr="ID">Idaho</STATE>
<STATE abbr="IL">Illinois</STATE>
<STATE abbr="IN">Indiana</STATE>
<STATE abbr="IA">Iowa</STATE>
<STATE abbr="KS">Kansas</STATE>
<STATE abbr="KY">Kentucky</STATE>
<STATE abbr="LA">Louisiana</STATE>
<STATE abbr="ME">Maine</STATE>
<STATE abbr="MD">Maryland</STATE>
<STATE abbr="MA">Massachusetts</STATE>
<STATE abbr="MI">Michigan</STATE>
<STATE abbr="MN">Minnesota</STATE>
<STATE abbr="MS">Mississippi</STATE>
<STATE abbr="MO">Missouri</STATE>
<STATE abbr="MT">Montana</STATE>
<STATE abbr="NE">Nebraska</STATE>
<STATE abbr="NV">Nevada</STATE>
<STATE abbr="NH">New Hampshire</STATE>
<STATE abbr="NJ">New Jersey</STATE>
<STATE abbr="NM">New Mexico</STATE>
<STATE abbr="NY">New York</STATE>
<STATE abbr="NC">North Carolina</STATE>
<STATE abbr="ND">North Dakota</STATE>
<STATE abbr="OH">Ohio</STATE>
<STATE abbr="OK">Oklahoma</STATE>
<STATE abbr="OR">Oregon</STATE>
<STATE abbr="PA">Pennsylvania</STATE>
<STATE abbr="RI">Rhode Island</STATE>
<STATE abbr="SC">South Carolina</STATE>
<STATE abbr="SD">South Dakota</STATE>
<STATE abbr="TN">Tennessee</STATE>
<STATE abbr="TX">Texas</STATE>
<STATE abbr="UT">Utah</STATE>
<STATE abbr="VT">Vermont</STATE>
<STATE abbr="VA">Virginia</STATE>
<STATE abbr="WA">Washington</STATE>
<STATE abbr="WV">West Virginia</STATE>
<STATE abbr="WI">Wisconsin</STATE>
<STATE abbr="WY">Wyoming</STATE>
</STATELIST>

5 ответов


самый простой подход-сделать хэш-функцию не требуется.

var states = {
    'AL': 'Alabama',
    'AK': 'Alaska',
    'AZ': 'Arizona',
    'AR': 'Arkansas',
    'CA': 'California',
    'CO': 'Colorado',
    'CT': 'Connecticut',
    ...
    'WY': 'Wyoming'
};

var stateName = states["WY"];

редактировать

теперь я лучше понимаю, что getState() необходимо получить имена состояний с сервера. Это помещает вас в мир асинхронного кодирования, которое сильно отличается от обычного синхронного кодирования.

самое главное, чтобы понять, что getState() не может просто вернуть имя состояния для данной аббревиатуры состояния. Почему? Потому что вызов ajax на сервер асинхронные - другими словами getState() не будет ждать ответа сервера перед возвращением.

есть два основных подхода к обработке asynchronicity :

  • передать функцию(ы) обратного вызова в getState() сказать ему, что делать, когда ответ получен
  • организовать getState() для возврата специального типа объекта, называемого "promise", который может быть обработан где getState() вызывается, таким образом, что он будет реагировать, когда сервер ответил.

в приведенном ниже коде используется второй подход.

var states = {};//cache of state names, with state abbreviations as keys
function getState(abbr) {
    var dfrd = $.Deferred();//A deferred object, whose promise will be returned.
    if(!states[abbr]) {
        $.ajax({
            url: "states.asp",
            dataType: 'XML',
            success: function(data) {
                //Load up the cache
                $.each($('state', data), function(i, el) {
                    states[el.attr('abbr')] = $(el).text();
                });
                //Now resolve or reject the deferred object depending in whether states[abbr] has been cached
                if(states[abbr]) {
                    dfrd.resolve(abbr, states[abbr]);//Success! Let's resolve the deferred object (and its promise).
                }
                else {
                    dfrd.reject(abbr, 'States successfully downloaded but ' + abbr + ' was not included');
                }
            },
            error: function() {
                dfrd.reject(abbr, 'Download of states failed');
            }
        });
    }
    else {
        //The state name is already cached
        //The deferred object (and its promise) can be resolved without needing to make another ajax call.
        dfrd.resolve(abbr, states[abbr]);
    }
    return dfrd.promise();
}

непроверенные

теперь все, что вам нужно знать, как назвать getState().

getState("WY").done(function(abbr, state) {
    alert(abbr + ': ' + state);
    //other stuff here
}).fail(function(abbr, message) {
    alert(abbr + ': ' + message);
    //other stuff here
});

как вы можете видеть, значение, которое вы хотели getState() для возврата теперь появляется как второй аргумент . Для хорошей меры аббревиатура ("WY") появляется в качестве первого аргумента.

если вы хотите обработать ошибку условия (всегда хорошая идея), тогда сделайте это в .fail() обратный.

см. комментарии в коде для получения дополнительной информации о том, как все работает.


в вашем коде абсолютно ничего не сломано. Смотрите это рабочая демо.

function getState(abbr){
   if (abbr=="WY")
   {
   return "Wyoming";
   }
}
var stateName = getState("WY");
alert(stateName);
​

HTML-код:

<div id="msg">...</div>

JS:

function getState(abbr){
   if (abbr=="WY")
   {
   return "Wyoming";
   }
}
var stateName = getState("WY");
​document.getElementById('msg').innerHTML=stateName;

это будет много if операторы для оценки: функция потенциально должна пройти через все 50 if заявления, чтобы добраться до Вайоминга! Я бы переписал его с switch заявление, вот так:

function getState(abbr){

   switch case(abbr) {

      case "WY":
         return "Wyoming";
      ...

   }
}

Я думаю, что это должно быть быстрее. Я бы также добавил default case, на всякий случай, если вход плохой.


это только мое решение. Я все еще хватаюсь за соломинку, пытаясь понять поведение asynch, но вот что сработало:

вместо:

function searchServing(which,choice){
   var state = getState("WY");
   $("#searchResults").html("<tr><td>" + state + "</td></tr>");
   .get(function() {

   } //for reference call this getSearchServing
}

мне пришлось отменить вызов так:

function getState(abbr){
  .get(function(){
      $("#searchResults").html("<tr><td>" + state + "</td></tr>");
  })
  .success(function() { 
    searchServing('serving',abbr);
  })
}

все еще не уверен, почему getSearchServing будет работать до getState и не уверен, почему я не мог вернуть значение из getState ???