1

我正在尝试获取一些直播的在线状态和观众人数。我通过 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
});
4

2 回答 2

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)
        });

如果在处理异步响应返回的数据时不考虑异步响应,则可能会产生不一致的结果。

让我知道这是否有帮助。

于 2012-05-31T13:17:16.117 回答
1

“this”是上下文相关的,您正在进入闭包,这会将“this”更改为您不期望的内容。考虑将对象缓存在每个...的顶部...

var $this = $(this);
于 2012-05-31T12:54:09.257 回答