函数中的JavaScript匿名函数行为异常
我正在用javascript做一个简单的应用程序。我有一个main_脚本,可以调用所有东西。全局变量提要是一个数组,如下所示:函数中的JavaScript匿名函数行为异常,javascript,jquery,arrays,json,Javascript,Jquery,Arrays,Json,我正在用javascript做一个简单的应用程序。我有一个main_脚本,可以调用所有东西。全局变量提要是一个数组,如下所示: var feeds = []; 然后,我使用函数从多个URL数组加载JSON文件: feeds = LoadJsonFeeds(urls); // Load feeds console.log("main_code feeds.length: " + feeds.length); 我后面提到的那个控制台日志。好的,现在他是我的loadjsonfeed,在不同的.js
var feeds = [];
然后,我使用函数从多个URL数组加载JSON文件:
feeds = LoadJsonFeeds(urls); // Load feeds
console.log("main_code feeds.length: " + feeds.length);
我后面提到的那个控制台日志。好的,现在他是我的loadjsonfeed,在不同的.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;
}
我只是不明白背后的逻辑!它怎么可能首先返回一个没有任何内容的函数,然后主脚本继续。之后,函数将逐个修改全局变量feed。我怀疑匿名函数,但不知道如何处理它
我想得到什么?很简单,我想要一个函数,从URL加载JSON文件。例如,url[0]有50个提要,url[1]有20个提要。如果一切正常,那么它应该返回70个提要的数组。我第一次在main_脚本中使用它,然后每隔几秒钟调用一次更新。在这个函数中,我检查哪个提要是新的,并将其放在其他地方:
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,所以不会发生forloop。但无论如何,它仍然会改变全局变量提要。对于主要功能来说,这并不重要。在全局变量中,数据都在其中,但我真的需要找到一个新的数据并对其进行一些处理。但既然不是这样,我就迷路了
我遗漏了什么,如何修复?谢谢大家! Your console.logLoadJson 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)
});
}
}
异步代码始终是异步的:p。。除非你有意让它与这样的东西同步。当然,这些评论只是为了显示它正在发生什么。谢谢,我试试这个。我怀疑使用回调,但我对javascript还是相当陌生的。
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