0

我试图让一些javascript运行一个for循环,该循环将创建一个xml文件,然后在循环完成后访问一个允许用户下载文件的链接。目前发生的情况是它在创建文件的过程中完成了一半,然后向用户发送了下载文件的链接。

我按照这个问题的建议创建了一个回调变量并将下载链接移动到另一个函数,但这也没有解决问题。还有其他人知道怎么做吗?我的代码是:

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";
      }
    });
  }
}
4

2 回答 2

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";
      }

    });
  }
}

这样,您可以在帖子完成时评估功能。我还内联了它以使变量的访问更简单。

顺便说一句:总是在 JavaScript 中使用===over看看为什么==

编辑

循环索引i应从 0 开始。还应将其声明为局部变量,而不是全局变量。

for ( var i = 0; i < numResults; i++ )

否则循环将只运行 5 次, anumResults为 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);
  }
}

这会延迟每个请求,因此并不是每个请求都在一帧中进行。

于 2012-12-12T02:17:19.040 回答
0

看起来您正在使用 jQuery。您发布的代码不正确,应该是这样的:

$.post( 'linkToTheFileThatCreatesTheXMLFile', {Parameters}, function() {
    download(numResults);
});

(除非你的代码格式搞砸了)

另外,请确保numResults由 callbackcount 定义和初始化。(可能是范围问题)

于 2012-12-12T02:18:08.417 回答