私は Javascript クロージャーを理解しようとしてきましたが、何かに夢中になっていると思いました。内部関数内で (for ループによって生成された) 反復された整数を正常に返すことができました。
ただし、問題のこの関数は、関数自体によって生成されたパラメーターも受け取ります。私の用語を許してください-しかし、それはコールバックパラメータかもしれません(基本的に、パラメータの値は私が送った関数に基づいて返されます)。
以下に私の問題の詳細な説明がありますが、まず最初に、問題のコードを次に示します (クロージャが機能している場合 - [値] は反復ごとに変化する i の値です):
FB.api('/me/tagged?limit=100', function(response) {
for (var i=0; i<response.data.length; i++){
var taggedId = response.data[i].id;
var fromId = response.data[i].from.id;
var fromName = response.data[i].from.name;
var taggedQuery = new Parse.Query('tagged');
taggedQuery.equalTo('taggedId',taggedId);
taggedQuery.first({ //.first returns the first match (.find returns all)
success: (function(value) {
return function() {
console.log(response.data[value]);
}
})(i),
error: function(taggedRecError){
console.log('error: '+taggedRecError.message);
}
});
} //for
});
基本的に、上記では、ユーザーのタグ付き投稿を取得するために Facebook にクエリを実行しています。for ループを使用して、各結果を反復処理します。
次に、Parse.js を使用して、このタグ付きオブジェクトのレコードが保存されているかどうかを照会します。
私は自分のコードがそうしているかどうか (保存されたオブジェクトがあるかどうか) を認識したいと考えています。Parse では、通常、次のようなものを使用してこれを行います。
taggedQuery.first({ //.first returns the first match (.find returns all)
success: function(value) {
if(value){
//do nothing
}
else {
//do something - e.g. save to Parse data store
}
}
});
ご覧のとおり、次に何をすべきかを決定するために、返されたパラメーター (値) の存在を使用します。
ただし、最初のコード ブロックでは、クロージャーを機能させるには、パラメーター ('(i)') を直接 success 関数に渡して、関数内で使用する i の適切な値を取得する必要があることがわかります。関数。ただし、これにより、Parse から取得した結果が歪められます。つまり、返されたオブジェクトは、パラメーターを渡した結果であり、Parse がデータ ストアに基づいて返す結果ではありません。
私はキャッチ 22 にいるようです: パラメータを手動で渡して正常に閉じる (ただし、Parse 呼び出しから返されたパラメータは失われます)、またはパラメータを渡さないで、Parse がデータ ストアに基づいて正しい応答を返すようにします (ただし、次に、上記の関数内で i の値が間違っています。つまり、クロージャはありません)。
それが明確であることを願っています。そうでない場合は、お知らせください。どんな助けでも感謝します。