2016-07-22 10 views
1

私は(ループで)順次、いくつかの非同期イベントを実行jQueryを使っていくつかのJavaScriptをコーディングしようとしています。以前の非同期イベントが完了した後にのみ反復処理を行います。jQueryを順次実行し、非同期イベント

基本的な考え方は次のとおりです。

for (var i = 0; i < someLength; i++) { 
    // 1. dynamically add a <form> and <input>s to the DOM 
    // 2. submit the form to a target <iframe> 
    // 3. wait for an async callback indicating the form has been submitted 
} 

私は#1、#2のコードを働いている、と私は、フォームを送信したときに知ってにloadイベントリスナーを添付することができますが完了しました:

$('.iframe').on('load', function() { ... 
}); 

for (var i = 0; i < someLength; i++) { 
    // 1. dynamically add a <form> and <input>s in the DOM 
    // 2. submit the form to a target <iframe> 
    // 3. wait for an async callback indicating the form has been submitted 
} 

問題は、私はループロジックにreadyコールバックを結びつける方法がわからないです。私は延期/約束を調べようとしましたが、実際にこれらの概念を正しく適用する方法は見当たりませんでした。

答えが約束を使用するのであれば、ループが進行している間に「ローディング」スピナーを表示するコードを組み込んでループの外に出たらスピナーを削除する方法も見たいと思う。

ありがとうございます!

答えて

2

For-loopのようなもの、あなたがチェーン彼らにしたい場合は特に非同期操作を嫌います。解決策は次のようになります。

$('.iframe').on('load', function() { ... 
    // increment i 
    //if(i >= someLength) exit 
    // 1. dynamically add a <form> and <input>s in the DOM 
    // 2. submit the form to a target <iframe> 
}); 

//for (var i = 0; i < someLength; i++) {//no loop 
//} 
    // 1. dynamically add a <form> and <input>s in the DOM 
    // 2. submit the form to a target <iframe> 
    // 3. nothing to wait 
+0

ありがとう@Alex。だから、このソリューションでは、基本的にすべてのサブミットを待ち行列に入れ、 'someLength'回数だけ' load'コールバックを待っていますか?前回の提出が成功した場合(次回の提出が成功したか失敗したかを知る方法があると仮定した場合)、次回の提出をしたい場合はどうすればよいですか? –

+0

'.load'ハンドラでは、現在の状態をチェックして、次に何をするかを決めることができます。 –

+0

右は、私が提出した要求のすべて/キックオフ 'for'ループにキューイング、および1つの要求が終了すると、' load'ハンドラが戻ったばかりと呼ばれますれますあなたのコードではと思います。このスキームでは、前回の失敗が実行されなかった場合、次の実行が実行されないようにすることはできません。 –

2

は、私はあなたの代わりに、forループの再帰的な方法でそれを行うことができると思います。 this-

$("#imgSpinner").show(); 
someFunction(0,someLength); 

function someFunction(currentSeq,totalIterations) 
{ 
    $.ajax({ 
      url: URL, 
      type: 'POST', 
      contentType: 'application/json; charset=utf-8', 
      success: function (result) { 
        if (currentSeq<totalIterations) 
         someFunction(currentSeq++,totalIterations); 
        else 
         $("#imgSpinner").hide(); 
      }, 
      error: function (error) { 
       //handle error 

      } 
    }); 

} 
+1

ありがとうございます。私は別のドメインにPOSTしているため、 '$ .ajax'を使用できません。理想的には、私はそれを適切に使用する方法(例で)を学びたいので、まだ約束/延期を実装しているソリューションを希望します。 –

0

フォームとフィールドを作成するためのループを作成する方法を理解しようとしていますが、フォームにはすべて同じフィールドが含まれていますか?つまり、複数の電子メールアドレスまたは何か?

設計を理解せず、私はそれが次のデータを提出終了したときに、その後いくつかのデータを提出するの一例として、あなたにこれを与えるでしょう。

$.when(AjaxSubmitFirstData.call()).done(function (data) { 
    $.when(AjaxSubmitSecondData.call()).done(function (data) { 
    // finished 
    }); 
}); 

var AjaxSubmitFirstData = { 
    call: function() { 
    return $.ajax({ 
     url: url, 
     type: 'POST', 
     data: "{}", 
     contentType: 'application/json; charset=utf-8', 
    }).done(function (data) { 
    }).fail(function (jq, textStatus) { 
    }); 
    } 
}; 

var AjaxSubmitSecondData = { 
    call: function() { 
    return $.ajax({ 
     url: url, 
     type: 'POST', 
     data: "{}", 
     contentType: 'application/json; charset=utf-8', 
    }).done(function (data) { 
    }).fail(function (jq, textStatus) { 
    }); 
    } 
}; 
+0

ありがとうございます。私は(それぞれの要求で異なるデータを持つ)別のドメインに複数の投稿を送信していますので、(理由は同一生成元ポリシーの)AJAXを使用することはできませんので、私は複数のフォームを作成する必要がある理由があります。 '$ .ajax'を使わないときに遅延を使う方法を示すためにあなたの答えを修正することができますか? –

関連する問題