wake-up-neo.com

Rückgabe einer Zeichenfolge in Javascript

Ich versuche, eine einfache Funktion zu erstellen, die beim Aufruf die korrekte Zeichenfolge zurückgibt:

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

und dann ist der Anruf so:

var stateName = getState("WY");

Es wird jedoch nur Folgendes zurückgegeben: 0

Entschuldigung, wenn mir etwas offensichtlich fehlt.

UPDATE - mein Origin-Problem war wegen eines "&" hier ist der eigentliche Code, mit dem ich mich befasse:

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;
}

Ich bekomme als Ergebnis meines Anrufs "undefined": 

alert(getState("WY"));

Alarm ("x" + Status) funktioniert.

UPDATE # 2 --- Hier ist alles, was States.asp generiert (fürs Erste) ... später werden Unternehmen zurückgegeben usw.

<?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>
7
tree

Am einfachsten ist es, einen Hash zu erstellen - es ist keine Funktion erforderlich.

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

var stateName = states["WY"];

BEARBEITEN

Jetzt verstehe ich besser, dass getState() Statusnamen vom Server abrufen muss. Dies versetzt Sie in die Welt der asynchronen Codierung, die sich deutlich von der normalen synchronen Codierung unterscheidet.

Das Wichtigste ist, dass getState() nicht einfach einen Zustandsnamen für eine bestimmte Zustandsabkürzung zurückgeben kann. Warum? Da der Ajax-Aufruf an den Server asynchronous - lautet, wartet getState() nicht auf die Antwort des Servers, bevor er zurückkehrt.

Es gibt im Wesentlichen zwei Ansätze für den Umgang mit Asynchronität:

  • Übergeben Sie Callback-Funktion (en) an getState(), um anzugeben, was zu tun ist, wenn eine Antwort empfangen wird
  • veranlassen, dass getState() einen speziellen Objekttyp zurückgibt, der als "Versprechen" bezeichnet wird und mit dem Aufruf von getState() behandelt werden kann, und zwar so, dass er auf eine Antwort des Servers reagiert.

Der folgende Code übernimmt den zweiten Ansatz.

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();
}

ungeprüft

Jetzt müssen Sie nur noch wissen, wie Sie getState() aufrufen.

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

Wie Sie sehen, erscheint der Wert, den Sie getState() zurückgeben wollten, nun als zweites Argument einer .done()-Funktion. Für eine gute Maßnahme erscheint die Abkürzung ("WY") als erstes Argument. 

Wenn Sie mit Fehlerbedingungen umgehen möchten (immer eine gute Idee), tun Sie dies in einem .fail()-Callback.

In den Kommentaren im Code finden Sie weitere Hinweise, wie alles funktioniert.

7

Es ist absolut nichts in Ihrem Code gebrochen. Siehe diese Arbeitsdemo .

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

HTML:

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

JS:

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

Das sind viele if-Anweisungen, die ausgewertet werden müssen: Die Funktion müsste möglicherweise alle 50 if-Anweisungen durchlaufen, um nach Wyoming zu gelangen! Ich würde es mit einer switch-Anweisung so umschreiben:

function getState(abbr){

   switch case(abbr) {

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

   }
}

Ich denke, das sollte schneller gehen. Ich würde auch einen default-Fall hinzufügen, nur für den Fall, dass die Eingabe schlecht ist.

2
frenchie

Das ist nur meine Lösung. Ich greife immer noch nach Strohhalmen und versuche, asynchrones Verhalten zu verstehen.

Anstatt:

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

   } //for reference call this getSearchServing
}

ich musste den Anruf zurücknehmen, also:

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

immer noch nicht sicher, warum getSearchServing vor getState ausgeführt wird und nicht sicher ist, warum ich keinen Wert von getState zurückgeben kann ???

0
tree