2011-07-20 2 views
0
function nicktoid(nick){ 
    if (typeof nick == "String") { 
    var u = "http://xxxxxx.xxxx/" + nick ; 
    var xhr2 = new XMLHttpRequest(); 
    xhr2.open('GET',u, true); 
    xhr2.setRequestHeader('Cache-Control', 'no-cache'); 
    xhr2.setRequestHeader('Pragma', 'no-cache'); 

    xhr2.onreadystatechange = function() { 
     if (xhr2.readyState == 4) { 
     txt2 = xhr2.responseText; 
     var el2 = document.createElement("div"); 
     el2.innerHTML = txt2; 

     anchors = el2.getElementsByTagName("a"); 
     for (var i=0;i< anchors.length;i++){ 
      if (anchors[i].parentNode.id == "profile_avatar"){ 

       anc.push(anchors[i]); 
      } 


     } 

     var res = anc[0].href; 
     var arstr = res.split("_"); 
     var resul = arstr[0].substr(6); 

} 

} 



} 
} 

私は上記のコードを持っています。ニックルートルーチンにvar resulを返す正しい方法は何ですか?この例ではどのように値を返すのですか?

+0

私にはJavaScriptの演算子が最初にどのように動作するかを学ぶでしょうを実行するので、コールバック関数を使用します:[typeof演算](https://developer.mozilla.org/en/JavaScript/Reference/演算子/特殊/ typeof) – ChaosPandion

+0

[JavaScriptで外部スコープにアクセスする]の複製が可能です(http://stackoverflow.com/questions/6673712/accessing-outer-scope-in​​-javascript) – ChaosPandion

答えて

2

Ajaxリクエストを非同期

function nicktoid(nick, callback){ 
    ... 
    xhr2.onreadystatechange = function() { 
     ... 
     callback && callback(resul); 
    } 
} 

nicktoid('foobar', function(resul) { 
    console.log(resul); 
}); 
+0

このコードはresulを返しますか?つまり、var x = nicktoid( 'foobar'、function(resul){ console.log(resul); })を使用できますか? ?? – DrStrangeLove

+0

いいえ、この関数は非同期Ajax要求を実行しているため、結果を返すことはできません。この非同期性をサポートするコードをリファクタリングする必要があります。つまり、戻り値処理をその関数内に配置する必要があります。 – roryf

+0

私は、ありがとう!しかし、なぜこの例ではブール演算子を使用しますか? – DrStrangeLove

2

一般的に、ajaxは非同期です。

返すことができません - コールバックを使用する必要があります。


あなたはnextFuntion(resul);を実行して、そこで情報を解析できます。

+0

Nealの答えに追加すると、nextFunctionニックトイドに入れる。定義は次のようになります:function nicktoid(nick、nextFunction){}。後で、この呼び出しは次のようになります。nicktoid( "whatever"、function(resul){/ *ここでは* /}を使用します); – jimbojw

+0

この例ではどのようにコールバックを使用しますか? – DrStrangeLove

+0

@DrStrangeLove - 私は私の答えで説明しました... – Neal

関連する問題