2012-05-11 9 views
0

これはコードよりもタイミングが遅いので、実際はJSONレスポンスを取得する最良の方法に関するアドバイスを探しています。JqueryのJSON AJAXレスポンスのタイミング

このコードでは、特定のアイデア(idea_id)に関するコメントを得るためにこのコードを使用しています。コメントにはユーザーID(Facebook)のみが保持されます。すべてのデータが戻ってくると、成功は何らかの順序で画面に印刷する準備ができたデータをソートします。

成功の一環として、各コメントの下に著者情報の一部として日付、時間、FB画像と名前があります。

日時は動作します。グラフを使用した画像は機能しますが、名前はウィンドウの読み込みに少し遅れていますので、それを呼び出せないので、定義されていない状態に戻り、名前がポップアップします。私はAjaxがこれを行うことを意図していると理解しています。

これをラウンドするにはどうすればよいでしょうか。

ありがとうございます。

アンドリュー

EDIT

私も以下の提案で、この作業を行うことができませんでした。

EDIT AGAINちょうどbfの新しいアップデートバージョンが下記のように表示されます。また働いただろう。しかし、私はこの1つの機能に一日を費やして遊んでいないことを敢行しています。

FB.apiが出現するとすぐに、私はその側から値を得ることができませんでした。そこで私は別のアプローチをとった。今

  $gc_result = mysql_query($gc_query); 
    while ($result = mysql_fetch_array($gc_result)) { 
     $jsonURL = "https://graph.facebook.com/" . $result['user_id'] . "/"; 
     $json = json_decode(file_get_contents($jsonURL), true); 
     $result["name"] = $json['name']; 

     $data[] = $result; 
    } 

    echo json_encode($data); 

次のよう

むしろAJAXよりも、私は、JSONはその照会次に、uidとを含む、データを取得し、PHP側からクエリを使用し、(は、mysql_fetch_array)アレイの上にボルトで固定しました私はその後、次の操作を行うとjQuery以内にそれを呼び出すことができる、ということがあります。

for(var i = 0; i < len; i++) { 
    var pic = '<img src="https://graph.facebook.com/' + result[i].user_id + '/picture?type=small" align="middle" />'; 
    html = '<p>' + result[i].comment + '<br><hr>Date Added: ' + result[i].date + ' by ' + pic + ' ' + **result[i]['name']** + '<br><hr><hr></p>'; 
    $('#comms').append(html); 
         } 

このすべてが素晴らしい作品、と私はプログラミングのjQueryへの完全な初心者ですし、FacebookのAPIとJSONを使用して、それでも私は後ろに座りますこのソリューションにかなり感心しています。私が逃げ出す前に、これ、パフォーマンス、またはセキュリティの賢明な潜在的な欠陥はありますか?

アドバンスでもう一度おねがいします。

アンドリュー

答えて

2

あなたはFB.apiコールバックの内側に後にコードを移動する必要がありますのでFB.apiへの呼び出しは、おそらく(別のAjaxリクエスト)非同期です:

FB.api('/' + result[i].user_id + '?fields=name', function(AuthName) { 
    console.log(AuthName); 
    alert(AuthName.name); 
    authname = AuthName.name; 
    html = '<p>' + result[i].comment + '<br><hr>Date Added: ' + result[i].date + ' by ' + pic + ' ' + authname + '<br><hr><hr></p>'; 
    $('#comms').append(html); 
}); 

あなたはまた、持っていますforループのために可変スコープの問題。これを修正する方法の1つは、別の関数を使用してコールバックを作成することです。</script>前に、あなたの$(window).loadブロックの後にこの権利を追加します。

function createFbApiCallback(jsonResult) { 
    return function(AuthName) { 
     var authname = AuthName.name; 
     var pic = '<img src="https://graph.facebook.com/' + jsonResult.user_id + '/picture&type=small" align="middle" />'; 
     var html = '<p>' + jsonResult.comment + '<br><hr>Date Added: ' + jsonResult.date + ' by ' + pic + ' ' + authname + '<br><hr><hr></p>'; 
     $('#comms').append(html); 
    } 
} 

次にこれにあなたのループを変更します。

for(var i = 0; i < len; i++) { 
    FB.api('/' + result[i].user_id + '?fields=name', createFbApiCallback(result[i])); 
} 
+0

私はFB.apiを使用して以来、しばらくしていますが、私はそうであることを思い出しています。私は95%が非同期であることを確信しています – Stephen

+0

FB.apiの終了タグを移動すると、結果に未定義のエラーが発生していますか? –

+0

奇妙なことに、アクセス可能でなければなりません。 'FB.api'を呼び出す直前にエイリアスを定義してみてください:' var currentResult = result [i] '、それをコールバックの中で使います。 – bfavaretto

0

あなたが別のコールバック関数内でコールバック関数に依存しているコードを実行する必要がある場合は、実行最も内側のコールバック関数内のコードあなたのケースでは、FB APIコールバックの外にあるすべてのものをその内部に移動します。したがって、AJAX応答とFB.api応答の両方が返された場合にのみ、すべてのDOM操作が実行されます。

+0

正しい行を取得するためにforステートメントに依存しているため、すべてをインラインに入れることはできません。私は論理を理解していますが、APIが呼び出されると、それはまだ要素として与えられていないuidを要求していますか? –

+0

for(var i = 0; i '; のVaRのauthname; にconsole.log(ここでAuthName); のauthname = AuthName.name; HTML ='

'+もたらす[I] .comment +'


追加された日付: '+もたらす[I] + .date '+ pic +' '+ authname +'


'; $('#comms ')。append(html); }); } ' これは例として、未定義のエラーです。 –

関連する問題