提问人:Anslean 提问时间:8/28/2023 最后编辑:Anslean 更新时间:8/31/2023 访问量:64
为什么数组中的元素在访问它们时变得未定义?
Why do the elements in my array become undefined when I access them?
问:
我有一个充满视频对象的数组。当我将它们打印到控制台时,有 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); });
输出:
我不知道这里可能有什么问题。似乎这个问题一定是一个基本的 JavaScript 问题,但万一它最终成为其他问题:我正在使用 HTML、CSS、JS、AJAX 和足够的 JQuery 来进行这些 AJAX 调用。我也在使用 Google 的 YouTube API (v3),如果这在某种程度上很重要的话。我什至没有使用 HTTP/HTTPS,因为我只是在本地将其用作自定义主页。任何帮助将不胜感激。
答: 暂无答案
评论
(a, b) => a.date < b.date
.sort()
videos
data
.then()
console.log
videos