我有这个递归循环,其中函数内部至少有2个ajax get / post,并且递归发生在第一个ajax get之后。我的功能结构是这样的,
function Loop() {
$.get(url, data, function(result) {
for loop to render the result {
// render the result here
}
for loop to get another data using the result {
$.post(url, result.data, function(postResult) {
// I don't know what it did here since
// I don't have an access to this post
});
// is there a way here that i will not proceed if the post is not done yet?
}
setTimeout("", 1000); // I wait for 1 second for the post to finish
Loop(); // call the recursion
}, "json");
}
谁能告诉我这段代码有什么问题?为什么我从计算机上得到一个警告,我的脚本导致计算机运行缓慢。我知道这个代码是导致它的代码,但我不知道这个工作。
我知道在get内部的第二个循环内部会导致大量内存。有没有办法,如果ajax帖子没有完成,它将不会循环回来?
答案 0 :(得分:2)
首先这一行:
setTimeout("", 1000); // I wait for 1 second for the post to finish
不会让您的脚本等待,因为setTimeout
函数使用不当。我认为您应该考虑使用setInterval
来代替它:
function Loop() {
$.get(url, data, function(result) {
for loop to render the result {
// render the result here
}
for loop to get another data using the result {
$.post(url, result.data, function(postResult) {
// I don't know what it did here since
// I don't have an access to this post
});
// is there a way here that i will not proceed if the post is not done yet?
}
}, "json");
}
setInterval( Loop, 1000);
这将使你的功能每1秒执行一次。我想这正是你想要获得的。这里没有理由进行递归调用。
答案 1 :(得分:2)
你的setTimeout
不会整齐地暂停代码一秒钟:它会为一个(空的,在你的情况下)事件设置一个计时器,在一段时间后关闭。脚本的其余部分将继续与该脚本并行执行。
所以你现在比你想象的更频繁地调用你的递归函数。那是你的第一个问题。
然而,你最大的问题是无论你在帖子的结果中做什么,这完全在另一个范围内,你不能从那里打破Loop
功能。你的代码中没有任何东西可以打破递归,所以它是无限的,而且非常快,并且它会发送Ajax请求。
您需要更详细地描述您想要实现的目标,也许有人可以告诉您应该如何做。唯一可以确定的是你需要使用回调。我写了一个例子,但它做了很多假设。这是我想要实现的想法的很多近似值,但毫无疑问,您需要稍微调整一下以满足您的需求。希望它能让您了解需要使用的工作流程:
function Loop() {
$.get(url, data, function(result) {
for loop to render the result {
// render the result here
}
// this is what you're looping over in your second loop
var postQueue = result.someArray;
renderChildData(postQueue, 0);
}, "json");
}
function renderChildData(array, index) {
// this is just one item in the loop
var currentItem = array[index];
$.post(url, currentItem, function(postResult) {
// we have received the result for one item
// render it, and proceed to fetch the next item in the list
index++;
if(index < array.length) {
renderChildData(array, index);
}
});
}
答案 2 :(得分:0)
当你在页面上使用巨大的代码时,它基本上就会发生.. 所以试着压缩这段代码