0

我写了一些函数,我调用了abApi.general.getUserById函数,但是当我打印输出到$("#friend-requests-block")我的name变量时是空的。$("#friend-requests-block")我知道这是javascript,我在回调中尝试 getUserById,但后来我没有type。我怎样才能解决这个问题?

                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...in数组不是最好的想法。

于 2012-10-05T07:24:13.527 回答