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

「これ」は文脈上のものであり、「これ」を予期しないものに変更するクロージャに陥っています。それぞれの上部にあるオブジェクトをキャッシュすることを検討してください...

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