FacebookのグラフAPIを使用して、ユーザーのフレンドリストを取得し、テンプレートとランダムな友だちに基づいてステータスメッセージを生成しています。 return(response);
の代わりにalert(response.data[0].name);
を使用すると、私のコードが動作し、最初のFacebookの友人の名前がわかります。私のコードでそれをさらに使うと、定義されていないエラーが発生します。数時間かけて問題を解決しようとしていますが、これ以上のレスポンスやJSONフォーマットの問題を使用できないスコープに関する問題があると思います。私はjQueryのJSON解析も試してみましたが、そこには何も追加できませんでした。JSON出力はコード内で未定義のままですが、アラートは問題ありませんが、これはスコープに問題がありますか?
shuffle = function(v){
for(var j, x, i = v.length; i; j = parseInt(Math.random() * i), x = v[--i], v[i] = v[j], v[j] = x);
return v;
};
function getFriends() {
FB.login(function(response) {
if (response.session && response.perms) {
FB.api('/me/friends', function(response) {
return response;
});
}
} , {perms:'publish_stream'});
};
function selectFriend(){
var friends = getFriends();
friends = friends.data[0];
var findex = friends.length
var randomNumber = (Math.floor(Math.random() * 10) % findex);
return(friends[randomNumber].name);
};
function process(status){
status = status[0].toString();
var cindex = status.indexOf("{{friend}}");
while (cindex != -1){
status = status.replace("{{friend}}",selectFriend());
cindex = status.indexOf("{{friend}}");
}
return(status);
};
function newStatus(){
var status = [
"This status is named {{friend}}",
"This status loves {{friend}} but likes {{friend}} too.",
"This status goes by {{friend}} but you can call it {{friend}} if you like.",
"This status hates {{friend}}"
];
status = shuffle(status);
$('#status').text(process(status));
}
コードは、クリック時にnewStatus()を呼び出すことから始まります。
EDIT:
shuffle = function(v){
for(var j, x, i = v.length; i; j = parseInt(Math.random() * i), x = v[--i], v[i] = v[j], v[j] = x);
return v;
};
function newStatus(){
var status = [
"This status is named {{friend}}",
"This status loves {{friend}} but likes {{friend}} too.",
"This status goes by {{friend}} but you can call it {{friend}} if you like.",
"This status hates {{friend}}"
];
status = shuffle(status);
status = status[0].toString();
FB.login(function(response) {
if (response.session && response.perms) {
FB.api('/me/friends', function(response) {
var friends = response.data;
var findex = friends.length
var cindex = status.indexOf("{{friend}}");
while (cindex != -1){
var randomNumber = (Math.floor(Math.random() * 10) % findex);
var name = friends[randomNumber].name;
status = status.replace("{{friend}}",name);
cindex = status.indexOf("{{friend}}");
}
$('#status').text(status);
});
}
} , {perms:'publish_stream'});
}
まず、あなたの時間のおかげで、私はそれを感謝しています。私は、データが準備される前に次の機能が呼び出されるため、タイミングに関して、そしてなぜそれがコールの外で失敗しているのかを見ています。基本的にロジックをAPI呼び出し内に移動することをお勧めしたら、意図した結果に達すると思われますが、API呼び出しから戻すという問題が残っています。私はランダムな友人の名前(呼び出しの目的)を思いつくことができますが、それはまだ置換ループ内で使用するには速すぎます。 –
論理的には、あなたがしなければならないことは、FB呼び出しを行い、あなたの他の作業をまだ行わないことです。 FB呼び出しが完了し、FBデータを取得すると、FB呼び出しが完了して関数が呼び出されます。これはFBデータがあるため、他のすべての作業を行います。ループの途中でAPI呼び出しを行うことはできず、結果をループ内で使用できることが期待されます。これは非同期プログラミングです。時には痛みですが、それはブラウザの作業でAjaxが呼び出す方法です。 – jfriend00
いいえ、私はこの答えを完了してマークしました。私は今、必要なものに応じて、すべての関数をリファクタリングして、非同期の前または非同期で実行するようにしています。上記のコードを上に投稿しているので、似たような問題を抱えている人なら誰でもあなたの助けを借りてうまくいくでしょう。 –