为什么数组中的元素在访问它们时变得未定义?

Why do the elements in my array become undefined when I access them?

提问人:Anslean 提问时间:8/28/2023 最后编辑:Anslean 更新时间:8/31/2023 访问量:64

问:

我有一个充满视频对象的数组。当我将它们打印到控制台时,有 30 个元素 - 每个元素都是一个具有适当信息的预期视频对象。但是,当我尝试将该数组的单个元素打印到控制台时,控制台仅显示“未定义”。相应地,当我尝试访问该元素的数据时,由于未定义该元素,因此会产生错误。我使用的是 AJAX,但应该注意的是,每个承诺都保证在调用此函数时得到解决。此外,这是代码的最后一部分。因此,我无法想象数组的内容会如何变化。(鉴于这些是连续的代码行,如果这种更改如此可靠以至于总是发生在这两行之间,即使它是异步发生的,也会令人惊讶。

代码:

var allVideoPromises = [];
Object.keys(channels).forEach((channelName) => {
    var channel = channels[channelName];
    channel.uploadsPromise.then(function(data) {
        var videoList = JSON.parse(data);
        var channelPromises = [];
        for (var videoData in videoList.items) {
            var video = new YouTubeVideo(videoList.items[videoData].contentDetails.videoId, channel);
            channel.uploads.push(video);
            videos.push(video);
            channelPromises.push(video.videoPromise);
            allVideoPromises.push(video.videoPromise);
            video.videoPromise.then(function(data) {
                var data = JSON.parse(data);
                if (data.items.length > 0) {
                    var videoData = data.items[0];
                    video.title = videoData.snippet.title;
                    video.thumbnail = videoData.snippet.thumbnails.default;
                    video.buffer = (video.thumbnail.height > 90) ? (90 - video.thumbnail.height) / 2 : 0;
                    video.date = new Date(videoData.snippet.publishedAt);
                    video.loaded = true;
                }
            }).catch(function(err) { console.log(err); })
        }
        Promise.all(channelPromises).then(function(data) {
            channel.uploads.sort(function(a, b) { if (a.date < b.date) return 1; else if (a.date > b.date) return -1; return 0; });
        }).catch(function(err) { console.log(err); });
    }).catch(function(err) { console.log(err); });
});


Promise.all(allVideoPromises).then(function(data) {
    videos.sort((a, b) => a.date < b.date);
    console.log(videos);
    console.log(videos[0]);
    //setVideo(mostRecent, video);
}).catch(function(err) { console.log(err); });

输出:

enter image description here

enter image description here

我不知道这里可能有什么问题。似乎这个问题一定是一个基本的 JavaScript 问题,但万一它最终成为其他问题:我正在使用 HTML、CSS、JS、AJAX 和足够的 JQuery 来进行这些 AJAX 调用。我也在使用 Google 的 YouTube API (v3),如果这在某种程度上很重要的话。我什至没有使用 HTTP/HTTPS,因为我只是在本地将其用作自定义主页。任何帮助将不胜感激。

javascript jquery 数组 ajax undefined

评论

1赞 Sash Sinha 8/28/2023
仅供参考,您的排序函数不正确:未按照 的要求返回 -1、0 或 1。相反,它返回一个布尔值。查看 stackoverflow.com/questions/24080785/...(a, b) => a.date < b.date.sort()
3赞 Derek 8/28/2023
变量在哪里定义?videos
3赞 Daedalus 8/28/2023
为什么不使用处理程序定义的变量?data.then()
1赞 Jaromanda X 8/28/2023
你有两张输出图片 - 第二张似乎是你发布的代码中的两个 S ...第一张照片是什么?console.log
2赞 epascarello 8/28/2023
与应许有什么关系?videos

答: 暂无答案