1

私は 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 の値が間違っています。つまり、クロージャはありません)。

それが明確であることを願っています。そうでない場合は、お知らせください。どんな助けでも感謝します。

4

2 に答える 2

2

あなたは[].forEachそれをたくさん単純化するために使うことができます:

FB.api('/me/tagged?limit=100', function(response) {
    response.data.forEach(function(value, i) {
        var taggedId = value.id;
        var fromId = value.from.id;
        var fromName = value.from.name;
        var taggedQuery = new Parse.Query('tagged');
        taggedQuery.equalTo('taggedId', taggedId);
        taggedQuery.first({
            success: function(someOtherData) {
                console.log(value, i, someOtherData);
            },
            error: function(taggedRecError) {
                console.log('error: ' + taggedRecError.message);
            }
        });
    });
});
于 2012-07-23T18:51:30.823 に答える
0

あなたは正しい軌道に乗っています。これは、successパラメーターでやりたいことだと思います:

taggedQuery.first({ //.first returns the first match (.find returns all)
    success: (function(index) {
        return function(value) {
            //value is what Parse passes
            //index is your preserved index
        };
    }(i))
});
于 2012-07-23T18:54:26.487 に答える