0

xmlファイルを作成するループを実行するJavaScriptを取得しfor、ループが完了した後、ユーザーがファイルをダウンロードできるリンクにアクセスしようとしています。現在、ファイルの作成の途中で、ファイルをダウンロードするためのリンクがユーザーに送信されます。

この質問のアドバイスに従い、コールバック変数を作成し、ダウンロードリンクを別の関数に移動しましたが、それでも問題は解決していません。他の誰かがそれを行う方法を知っていますか?私のコードは次のとおりです。

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++ )

numResultsそうしないと、ループは aが 6の場合に 5 回しか実行されません。

編集 2 - 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 フレームに収まるわけではありません。

于 2012-12-12T02:17:19.040 に答える
0

jQueryを使っているようです。投稿したコードは正しくありません。次のようにする必要があります。

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

(コードのフォーマットが台無しになっていない限り)

また、numResultscallbackcount によって定義および初期化されていることを確認してください。(スコーピングの問題かもしれません)

于 2012-12-12T02:18:08.417 に答える