gpt4 book ai didi

JavaScript 函数中的匿名函数行为异常

转载 作者:行者123 更新时间:2023-12-03 04:00:45 31 4
gpt4 key购买 nike

我正在用 javascript 做简单的应用程序。我有“main_script”,我可以在其中调用所有内容。有一个全局变量“feeds”,它是一个数组,如下所示:

var feeds = [];

然后,我使用函数从多个 URL(也是数组)加载 JSON 文件:

feeds = LoadJsonFeeds(urls); // Load feeds
console.log("main_code feeds.length: " + feeds.length);

我稍后会提到的控制台日志。好的,现在他是我的 LoadJsonFeeds(在不同的 .js 文件中,只是一个函数):

function LoadJsonFeeds(urls) {
var feeds_tmp = [];
// URLs can be more - for example 50 feeds from url[0] and 20 from url[1]
for(var u = 0; u < url.length; u++) {
$.getJSON(url[u], function(data) {
var allFeeds = data.Result.Items; // allFeeds without check if they are ok
for(var i = 0; i < allFeeds.length; i++) {
// Is feed ok?
if (allFeeds[i].Text != null)
{
// Some more checking, but lets say ok for this
feeds_tmp.push(allFeeds[i]);
}
// This I mention later
console.log("LoadJson feeds.length: " + feeds.length);
}
});
}
console.log("LoadJson return"); // Mention later
return feeds_tmp;
}

这就是我正在努力解决的问题。当我查看控制台时,我看到的是:

LoadJson return
main_code feeds.length: 0
LoadJson feeds.length: 1
LoadJson feeds.length: 2
LoadJson feeds.length: 3
etc...

我只是不明白其背后的逻辑!它如何首先返回函数而不返回任何内容,然后 main_script 继续。之后,函数 ALTER 将全局变量一一“输入”。我怀疑匿名函数,但不知道如何处理它。

我想要实现什么目标?很简单,我想要一个从 URL 加载 JSON 文件的函数。例如 url[0] 有 50 个提要,url[1] 有 20 个。如果一切正常,那么它应该返回 70 个提要的数组。我第一次在 main_script 中使用它,然后在更新间隔中使用它,我每隔几秒调用一次。在此函数中,我检查哪个提要是新的并将其放在其他地方:

function UpdateFeeds(url) {
console.log("updating...");

var feeds_tmp = LoadJsonFeeds(url);
console.log("Update feeds_tmp.length: " + feeds_tmp.length); // This is 0
for(var f_tmp = 0; f_tmp < feeds_tmp.length; f_tmp++) { // This does not happen because feeds_tmp.length = 0
for(var f = 0; f < feeds.length; f++) {
// Check what feed is new and put it somewhere else (the new one)
}
}
}
feeds = feeds_tmp; // Make all new feeds the global variable
}

但是由于返回的数组是0,所以for循环不会发生。但无论如何它仍然会改变全局变量“feeds”。对于主要功能来说,这并不重要。在全局变量中,数据就在其中,但我确实需要找到一个新的数据并对其进行一些处理。但由于它不是这样工作的,我很迷失。

我缺少什么以及如何解决这个问题?谢谢!

最佳答案

您的 console.log("LoadJson feeds.length: "+ feeds.length); 稍后调用,因为它是异步调用,您可以将此函数更新为

    function LoadJsonFeeds(urls,callback) {
var feeds_tmp = [];
// URLs can be more - for example 50 feeds from url[0] and 20 from url[1]
for(var u = 0; u < url.length; u++) {
$.getJSON(url[u], function(data) {
var allFeeds = data.Result.Items; // allFeeds without check if they are ok
for(var i = 0; i < allFeeds.length; i++) {
// Is feed ok?
if (allFeeds[i].Text != null)
{
// Some more checking, but lets say ok for this
feeds_tmp.push(allFeeds[i]);
}
// This I mention later
console.log("LoadJson feeds.length: " + feeds.length);
}
if(u==url.length.1) // to make sure all URL loaded
callback(feeds_tmp)
});
}

}

并将你的函数称为

     feeds = LoadJsonFeeds(urls,function(feeds){
console.log("main_code feeds.length: " + feeds.length);

}); // Load feeds

关于JavaScript 函数中的匿名函数行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44733865/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com