【问题标题】:Returning a string in Javascript在Javascript中返回一个字符串
【发布时间】:2024-01-18 10:44:01
【问题描述】:

我正在尝试创建一个简单的函数,它会在调用时返回正确的字符串:

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

然后调用是这样的:

var stateName = getState("WY");

但是返回的只是:0

对不起,如果我遗漏了一些明显的东西。

更新 - 我的原始问题是因为“&”这是我正在处理的真实代码:

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" + state) 有效。

更新 #2 --- 这是 states.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>

【问题讨论】:

  • 你是如何使用stateName 来获取输出的?
  • 你确定你的脚本没有错别字吗,应该像这里写的那样工作。
  • 这是纯 JavaScript(不是 jQuery)。 This JSFiddle 表明您的确切代码按预期工作。您需要向我们展示您的实际函数和调用它的代码以获得任何额外帮助。
  • 我只是在控制台中尝试了这个,它可以正常工作。
  • jsfiddle.net/Wf5gm 控制台可以很好地读取您的代码。

标签: javascript string asp-classic return


【解决方案1】:

您的代码中绝对没有任何问题。看到这个working demo

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

【讨论】:

  • 对不起...毕竟这是我的代码中的错字(我使用“&”而不是“+”来连接字符串)。我已经定期使用 JQuery 几个星期了,但还没有弄清楚如何收到此类错误的警报......有什么建议吗?
  • 按 F12 启动浏览器开发工具。使用控制台选项卡来定位 JS 错误。开发工具在所有浏览器中都非常相似。 FF需要安装FireBug,其他主流浏览器都内置了开发工具。
  • “还没有弄清楚如何收到此类错误的警报” --- 试试 linter
【解决方案2】:

这将有很多 if 语句要评估:该函数可能必须遍历所有 50 个 if 语句才能到达怀俄明州!我会用switch 语句重写它,就像这样:

function getState(abbr){

   switch case(abbr) {

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

   }
}

我认为这应该更快。我还会添加一个default 案例,以防输入错误。

【讨论】:

    【解决方案3】:

    最简单的方法是做一个哈希 - 不需要函数。

    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() 在返回之前不会等待服务器的响应。

    基本上有两种处理异步的方法:

    • 将回调函数传递给getState(),告诉它在收到响应时要做什么
    • 安排getState()返回一种称为“承诺”的特殊类型的对象,可以在调用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() 返回的值现在显示为.done() 函数的第二个参数。为了更好地衡量,缩写(“WY”)作为第一个参数出现。

    如果您想处理错误情况(总是一个好主意),请在 .fail() 回调中执行此操作。

    查看代码中的 cmets 以获取有关一切如何工作的更多线索。

    【讨论】:

    • 聪明。并且它将通过获取确切的键值来防止处理所有不匹配的需要。
    • 谢谢,知道这很有用。但是,我需要返回的不仅仅是缩写和州名......缩写只是为了让我知道我正在寻找哪个州。我只是不确定为什么我没有从退货中得到结果。
    • 你需要了解ajax是异步的。我在上面进行了编辑以提供解释和一些代码。如果您没有第一次通过,请不要担心 - 它是非常先进的东西,可能至少会让您大吃一惊。延迟/承诺花了我一段时间来学习。
    • 谢谢 - 这正是我需要知道的。
    【解决方案4】:

    HTML:

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

    JS:

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

    【讨论】:

      【解决方案5】:

      这只是我的解决方案。我仍在试图理解异步行为,但这是有效的方法:

      代替:

      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 返回值???

      【讨论】:

      • Tree,你的问题,包括它的主要编辑,都是关于getState() - 一个将状态缩写转换为完整状态名称的函数。您自己上面的答案毫无意义。它没有解决getState() 的内部工作,并且在任何情况下都不是有效的javascript - 它会引发语法错误。我只能冒昧地建议您尚未找到解决方案。
      • @Beetroot-Beetroot... 当我在这两个函数中添加警报时,searchSearving(.get()) 将在 getState(.get()) 之前运行。即使首先调用了 getState(.get()) ......基本上我从来没有弄清楚如何传递信息,所以我只是打印了 getState() 的结果。我承认这不是绝对的解决方案。但是效果还不错。
      最近更新 更多