for循环后重定向到不同的网页

时间:2012-12-12 02:06:19

标签: javascript html for-loop callback

我正在尝试运行一些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";
      }
    });
  }
}

2 个答案:

答案 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。 (可能是一个范围问题)