jQuery操纵.each()里面的对象

时间:2012-05-31 12:49:30

标签: jquery this each

我正在尝试获取某些直播视频的在线状态和观看者数量。我正在通过AJAX从我的网站获取一系列对象。然后我迭代数组并向这些对象添加值。问题是,当我在控制台中记录这些对象的内容时,我发现了新创建的密钥,但是当我尝试记录该密钥的值时,它表示它未定义。

$.each(livestreams, function () {
    if(this.provider === 'TwitchTV') {
        $.ajax({
            url: 'http://api.justin.tv/api/stream/list.json?channel=' + this.channel.toLowerCase(),
            dataType: 'jsonp',
            jsonp: 'jsonp',
            success: $.proxy(function (stream) {
                this.live = true;
                this.count = stream[0].channel_count;
            }, this)
        });
    } else {
        $.ajax({
            url: 'http://api.own3d.tv/liveCheck.php?live_id=' + this.channel,
            dataType: 'xml',
            success: $.proxy(function (stream) {
                this.live = stream.find('isLive').text();
                this.count = stream.find('liveViewers').text();
            }, this)
        });
    }
    console.log(this);
    /* returns
            channel: "garenatw"
            count: 8237
            id: "3"
            live: true
            name: "garena"
            provider: "TwitchTV"
            username: "grifon"
            __proto__: Object 
            (of course, only for this specific object)
        */
    console.log(this.live); // returns undefined
});

2 个答案:

答案 0 :(得分:2)

您可以在设置值之前登录这些值。由于你正在处理ajax请求,所以你不应该线性思考。

您不应在功能结束时登录您的值,而应在成功函数结束时记录它们:

$.each(livestreams, function () {
    if(this.provider === 'TwitchTV') {
        $.ajax({
            url: 'http://api.justin.tv/api/stream/list.json?channel=' + this.channel.toLowerCase(),
            dataType: 'jsonp',
            jsonp: 'jsonp',
            success: $.proxy(function (stream) {
                this.live = true;
                this.count = stream[0].channel_count;
                console.log(this); //HERE
            }, this)
        });

如果在处理返回的数据时未考虑异步响应,则存在获得不一致结果的风险。

让我知道这是否有帮助。

答案 1 :(得分:1)

“这个”是上下文的,你会陷入关闭状态,将“这个”改为你不期望的东西。考虑在每个顶部缓存对象......比如

var $this = $(this);