2011-05-11 10 views
1

私はスクリプトにコードをしようとしています。1)テキスト入力フィールドからFBユーザーIDを読み込みます。&を配列にループします。2)FB.api名のそれぞれのIDを使用して、戻されたファースト・ネーム値を別の配列に保管します。 問題:ループのみ4に、インデックス1から行く必要があるため、何らかの理由で、すべての最初の名前がFB.api呼び出しの応答を、forループとJavascriptで配列に保存する

<script type="text/javascript"> 
var ids = new Array(); 
var names = new Array(); 
var fields = 4; 


function firstNames() { 

var i; 
var k; 


for (i=1;i<=fields;i++) 
    { 
     ids[i] = document.getElementById("field"+i).value; 
    } 

for (k=1; k<=fields; k++) 
    { 
     FB.api('/'+ids[k], function(response) { 
      names[k] = response.first_name; 
      alert(k+' test '+names[k]); 
     }); 
    } 

} 
</script> 

奇妙な余分で同じ配列インデックスの場所5.に保存FB.apiから受けています誰も似たようなものに遭遇した?どんな助けでも大歓迎です。

ありがとうございます。

答えて

0

同じApi呼び出しではありませんでしたが、実際には何か類似していました。

facebook apiの呼び出しが非同期であることを理解しておく必要があります。そして、最も重要なのは、それは遅いです。だからjavascriptは高速で、最初の応答が送信されるまでに、あなたのjavascript forループはすでに完了しています。だから、すべてがk = 5に送られます。これは、ループの後のkの値です。

これは、Javaのように、javascriptがハンドラの最終変数を使用する必要がないためです。

今、あなたはそれを修正する方法を理解していますか?こんにちは、申し訳ありませんが、私はこの種の問題があったときに汚れた解決策を出しました。

私は、関数(応答)本体でコードを直接処理し、中間変数を使用していませんでした。あなたの名前の配列を忘れたり、何か良いものを見つけたりすることができます。

+0

ああ、私はそれが何かになるのではないかと恐れていた。私は今、醜い方法でそれをして、後で回り道を考えようと思います。助けてくれてありがとうJoel! :) – Lasba

+0

"k"値が "5"の非同期api呼び出しが問題ではないと思う...高田幹人がこのコメントを読む: "技術的根本原因はスコープ解決/評価戦略" - http://blog.mixu.net/2011/02/03/javascript-node-js-and-for-loops/#comment-7980 –

2

読む: Javascriptを、Node.jsのとループ
を参照してください:実験#7:新
変数URL確立し、新たなスコープを持つ閉鎖:http://blog.mixu.net/2011/02/03/javascript-node-js-and-for-loops

を、私は同じ問題を持っていましたFB.apiはFORループの最終反復インデックスを取得します。

このソリューションを試してください:

for (k=1; k<=fields; k++) 
{ 
    // Closure with new scope establishing a new variable 
    (function() { 
    var index = k; // new variable 
    FB.api('/'+ids[index], function(response) { 
     names[index] = response.first_name; 
     alert(index+' test '+names[index]); 
    }); 
    }(); 
} 

アップデート:注意すべき一つのことは、それはすべて、各APIのネットワークの待ち時間に依存...あなたは1,4,2,3を得るかもしれない。すなわち、この例では、アラートは、おそらく順番に起こらないということです彼らが実行されている順番を呼び出す...

関連する問題