我正在尝试运行一些javascript来运行for
循环,这将创建一个xml文件,然后在循环完成后访问一个允许用户下载文件的链接。目前发生的事情是它在创建文件的过程中获得了一半,然后向用户发送链接以下载文件。
我跟着this question's advice并创建了一个回调变量并将下载链接移动到另一个函数,但是这也没有解决问题。有没有其他人知道怎么做?我的代码是:
var callbackcount=0;
function populateTemplate(numResults) {
for (i=1; i < numResults; i++) {
$.post('linkToTheFileThatCreatesTheXMLFile', {WithSomeParameters};
download(numResults);
}
}
function download(numResults) {
callbackcount++;
if (callbackcount == numResults) {
window.location.href="linkToPHPThatDownloadsFile";
}
}
谢谢堆
修改 Console.log结果:
LOG: 230 LOG: 330 LOG: 230 LOG: 330
LOG: 430 LOG: 530 LOG: 630 LOG: 730
LOG: 830 LOG: 930 LOG: 1030 LOG: 1130
LOG: 1230 LOG: 1330
如果numResults = 7
LOG: 27 LOG: 37 LOG: 47
或
LOG: 27 LOG: 37 LOG: 47 LOG: 57
等
修改 新代码:
function populateTemplate(numResults) {
var callbackcount = 1;
for (i=1; i < numResults; i++) {
$.post('linkToTheFileThatCreatesTheXMLFile', {WithSomeParameters}, function() {
callbackcount++;
console.log(callbackcount, numResults);
if(callbackcount === numResults - 1) {
window.location.href="linkToPHPThatDownloadsFile";
}
});
}
}
答案 0 :(得分:2)
$.post
是异步调用。所以当你到达最后一个循环时,闭包callbackcount
中的所有帖子将等于numResults
,所有帖子都不会通过。绝对不是最后一个。
$.post
允许在帖子完成后调用的回调。此回调应调用您的download
方法。
var callbackcount=0;
function populateTemplate(numResults) {
for (i=1; i < numResults; i++) {
$.post('linkToTheFileThatCreatesTheXMLFile', {WithSomeParameters}, function() {
callbackcount++;
if (callbackcount === numResults) {
window.location.href="linkToPHPThatDownloadsFile";
}
});
}
}
这样,您可以在帖子完成时评估该功能。此外,我还介绍了它使变量的访问更加集中。
BTW:在See why
中始终使用===
而不是==
修改强>
循环索引i
应该从0开始。它也应该被声明为局部变量,而不是全局变量。
for ( var i = 0; i < numResults; i++ )
否则循环将仅运行5次,numResults
为6。
编辑2 - 第二种方法
如果它与每帧过多的请求有关(我怀疑)你也可以尝试一下,看看它是否有所作为。
var callbackcount=0;
function populateTemplate(numResults) {
for (i=1; i < numResults; i++) {
setTimeout( function() {
$.post('linkToTheFileThatCreatesTheXMLFile', {WithSomeParameters}, function() {
callbackcount++;
if (callbackcount === numResults) {
window.location.href="linkToPHPThatDownloadsFile";
}
});
}, 100);
}
}
这会延迟每个请求,因此并非每个请求都在一帧中进行。
答案 1 :(得分:0)
看起来你正在使用jQuery。您发布的代码不正确,应该是:
$.post( 'linkToTheFileThatCreatesTheXMLFile', {Parameters}, function() {
download(numResults);
});
(除非你的代码格式化搞砸了)
另外,请确保{callncount}定义并初始化numResults
。 (可能是一个范围问题)