web-dev-qa-db-fra.com

Renvoyer une chaîne en Javascript

J'essaie de créer une fonction simple qui retournera la chaîne correcte quand elle s'appelle:

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

et alors l'appel est comme ceci:

var stateName = getState("WY");

Cependant, tout ce qui est renvoyé est: 0

Désolé si je manque quelque chose d'évident.

UPDATE - mon problème d'origine était dû à un "&", voici le vrai code avec lequel je traite:

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

Je deviens "indéfini" à la suite de mon appel: 

alert(getState("WY"));

Alert ("x" + state) fonctionne.

UPDATE # 2 ---Il y a tout ce que states.asp génère (pour l'instant) ... plus tard, il retournera des entreprises, etc.:

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

L'approche la plus simple consiste à créer un hachage - aucune fonction n'est requise.

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

var stateName = states["WY"];

MODIFIER

Maintenant, je comprends mieux que getState() doit extraire les noms d’État du serveur. Cela vous place dans le monde du codage asynchrone, qui est assez différent du codage normal et synchrone.

La chose la plus importante à réaliser est que getState() ne peut pas simplement renvoyer un nom d'état pour une abréviation d'état donnée. Pourquoi? Parce que l'appel ajax au serveur est asynchrone - autrement dit, getState() n'attendra pas la réponse du serveur avant de retourner.

Il existe essentiellement deux approches pour traiter l’asynchronicité:

  • transmet la ou les fonctions de rappel à getState() pour lui dire quoi faire quand une réponse est reçue
  • demandez à getState() de renvoyer un type spécial d'objet appelé "promesse" qui peut être traité à l'endroit où getState() est appelé, de manière à ce qu'il réponde lorsque le serveur a répondu.

Le code ci-dessous adopte la deuxième approche.

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

non testé

Il ne vous reste plus qu'à savoir comment appeler getState().

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

Comme vous pouvez le constater, la valeur que vous vouliez renvoyer de getState() apparaît maintenant en tant que deuxième argument d'une fonction .done(). Pour faire bonne mesure, l’abréviation ("WY") apparaît comme premier argument. 

Si vous souhaitez gérer les conditions d'erreur (toujours une bonne idée), faites-le dans un callback .fail().

Voir les commentaires dans le code pour plus d'indices sur le fonctionnement de tout.

7
Beetroot-Beetroot

Il n'y a absolument rien de cassé dans votre code. Voir cette démo de travail .

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

Il va falloir évaluer de nombreuses déclarations if: la fonction devra éventuellement passer en revue toutes les 50 déclarations if pour parvenir au Wyoming! Je le récrirais avec une instruction switch, comme celle-ci:

function getState(abbr){

   switch case(abbr) {

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

   }
}

Je pense que cela devrait être plus rapide. J'ajouterais également un cas default, juste au cas où l'entrée est mauvaise.

2
frenchie

Ceci est juste ma solution. Je suis toujours en train d'essayer de comprendre le comportement asynchrone, mais voici ce qui a fonctionné:

Au lieu de:

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

   } //for reference call this getSearchServing
}

j'ai dû inverser l'appel pour:

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

toujours pas sûr pourquoi getSearchServing serait exécuté avant getState et pourquoi je ne pouvais pas renvoyer une valeur de getState ???

0
tree