0

私はいくつかの関数を書き、関数を呼び出しましたが、変数へのabApi.general.getUserById出力を出力すると空です。私はこれがjavascriptであることを知っており 、コールバックで試してみましたが、そうではありません. どうすればこれを修正できますか?$("#friend-requests-block")name$("#friend-requests-block")getUserByIdtype

                for (var index in requests) {

                        var name = "";
                        var type = "";

                        if(requests[index].FriendRequestTypeId == 1) {
                            type = "private";
                        }
                        else {
                            type = "business";  
                        }

                        abApi.general.getUserById(abEnvironment.sessionToken, requests[index].FromUserId, function(response2){
                            name = response2.Name;  
                        });

                        $("#friend-requests-blocks").html($("#friend-requests-blocks").html() + "<div class=\"log-block\" id=\"friend-requests-log-"+requests[index].Id+"\"><a href=\"#\"><h2>"+ name + "("+ type +")</h2></a> <div class=\"friend-requests-buttons\" style=\"margin-top: 15px;\"> <a href=\"javascript:void(0)\" data-role=\"button\" style=\"margin: 0px 5px 0px 5px;\" onClick=\"abAction.approveFriendRequest("+requests[index].Id+", 1,"+requests[index].FromUserId+");\">Accept</a><a href=\"javascript:void(0)\"data-role=\"button\" style=\"margin: 0px 5px 0px 5px;\" onClick=\"abAction.approveFriendRequest("+requests[index].Id+", 0,"+requests[index].FromUserId+");\">Reject</a> <a class=\"button3\" href=\"javascript:void(0)\"data-role=\"button\" style=\"margin: 0px 5px 0px 5px;\" onClick=\"abAction.approveFriendRequest("+requests[index].Id+", 2,"+requests[index].FromUserId+");\">Later</a></div></div>");    

                }   
4

1 に答える 1

1

それはあなたが扱っているスコープの問題だけgetUserByIdではありませんが、それも非同期であるという事実です(スコープ以上のものです)。スクリプトが応答を受け取るまで、変数nameは設定されません。そうは言っても、ループを使用しているため、$('#friend-request-blocks').html()ビットを成功コールバックに移動してもカットされません。変数nametypeループの反復ごとに再割り当てされます。これを回避するには、クロージャーを使用する必要があります。

abApi.general.getUserById(abEnvironment.sessionToken,requests[index].FromUserId,
(function(type)
{//pass the current type as an argument to closure
    return function(response2)
    {
        var name = response2.Name;//declare local variable name, or use response2.Name
        $('#friend-request-blocks').html('html goes here with correct type: '+type+' and name: '+name);
    };
}(type)));

また、間違っている可能性もありますが、オブジェクトではなく配列をループしている印象を受けます。requestsが配列の場合は、ループではなくfor...in通常のループを使用することをお勧めしfor(var i;i<requests.length;i++)ます。for...inGoogle は、配列が最良のアイデアではない理由について、膨大な数の理由を示します。

于 2012-10-05T07:24:13.527 に答える