[解決済み] Javascriptで文字列を返す
質問
呼び出されたときに正しい文字列を返すような、簡単な関数を作ろうとしています。
function getState(abbr){
if (abbr=="WY")
{
return "Wyoming";
}
}
で、呼び出しはこんな感じです。
var stateName = getState("WY");
しかし、返されるのは0だけです。
明らかな見落としがあったらすみません。
UPDATE - 私の元の問題は、"&"のためだった。私が扱っている本当のコードはこちらです。
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;
}
私の呼び出しの結果として "undefined" が表示されます。
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>
解決方法は?
最も簡単な方法は、ハッシュを作ることです - 関数は必要ありません。
var states = {
'AL': 'Alabama',
'AK': 'Alaska',
'AZ': 'Arizona',
'AR': 'Arkansas',
'CA': 'California',
'CO': 'Colorado',
'CT': 'Connecticut',
...
'WY': 'Wyoming'
};
var stateName = states["WY"];
EDIT
を理解することができました。
getState()
は、サーバーからState名を取得する必要があります。これは、通常の同期コーディングとは全く異なる、非同期コーディングの世界に入っていくことになります。
最も重要なことは
getState()
は、指定された州の略称に対応する州名を単純に返すことはできません。なぜか?なぜなら、サーバーへのajaxコールは
非同期
- 言い換えれば
getState()
は、サーバーの応答を待たずに返します。
非同期性を扱うには、基本的に2つのアプローチがあります。
-
にコールバック関数を渡す。
getState()
レスポンスを受信したときに何をすべきかを指示するために -
手配する
getState()
という特別なタイプのオブジェクトを返すようにします。getState()
が呼び出されたときに、サーバーが応答したときに応答するような方法で。
以下のコードでは、2番目のアプローチを採用しています。
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()
の第2引数として表示されるようになりました。
.done()
関数を使用することができます。念のため、第一引数に略語("WY")が表示されています。
エラー条件を処理したい場合(常に良いアイデアです)、その処理は
.fail()
のコールバックです。
どのように動作するかの詳細は、コード内のコメントを参照してください。
関連
-
[解決済み] React with ES7: Uncaught TypeError: Cannot read property 'state' of undefined [duplicate] (未定義のプロパティ'state'を読み込むことはできません。
-
[解決済み】Syntax error: JavaScriptの不正なreturnステートメント
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでランダムな文字列/文字を生成する
-
[解決済み] JavaScriptで変数が文字列かどうかをチェックする
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Javascript:getElementById対getElementsById(両方が別のページで動作する)。
-
[解決済み】TypeError: 'undefined'はオブジェクトではありません。
-
[解決済み】JavaScriptで':'(コロン)は何をするのか?
-
[解決済み】Angular JS Uncaught Error。[インジェクター:モジュラー]。
-
[解決済み】webpack: モジュールが見つかりません。Error: 解決できない(相対パスで)
-
[解決済み】ある要素を別の要素に移動させるには?
-
[解決済み】未定義のプロパティ 'bind' を読み込めない。React.js【重複あり
-
[解決済み】JavaScriptのボタンonclickが機能しない
-
[解決済み】JS ファイルが net::ERR_ABORTED 404 (Not Found) を取得する)
-
[解決済み】React-Routerの子が1つしかない。