2017-08-07 16 views
-2

ajaxがエラーを返した場合、私は各ループから脱出することはできません。私は試しました

return false; 

と他の同様のものが、まだ$ .eachはまだ実行しています。

私はバックエンドからエラーメッセージを表示できるようにする必要があります(これは悪い習慣ですが、クライアントは複数のフォームを送信できなければならないすぐに。)。

私は間違ったことを誰でも説明できますか?

var postAll = function(button_clicked) 
{ 
e.preventDefault(); 

var form_response = []; 
var formsCollection = document.getElementsByTagName("form"); 

$.each(formsCollection, function (key, value) 
{ 
    console.log(value.action); 
    console.log(value.id); 

    var url = value.action; 
    var id = value.id; 
    var data = ($('#' + id + '').serialize()); 


    if (id == 'additionalInfo') 
    { 
     data = {'Add_info': $('#Add_info').val(),}; 
    } 

    if (id != 'DONE') 
    { 
     $.ajax({ 
     type: "POST", 
     dataType: 'json', 
     url: url, 
     beforeSend: function (xhr) 
     { 
      xhr.setRequestHeader('X-CSRF-TOKEN',$("#token").attr('content')); 
     }, 
     data: data, 
     success: function (data) 
     { 
      console.log('success'); // show response from the php script. 
      form_response.push(data); // show response from the php script. 
     }, 
     error: function (data) 
     { 
      console.log('fail'); // show response from the php script. 
      display_errors(data, id); // show response from the php script. 
      return true; 
     } 
     }); 
    } 
}); 
} 
+1

それのようにする必要があり機能していないまさに? –

+0

リクエストのいずれかが失敗した場合、 'each'の繰り返しを早く終了したいのですか?彼らは現在非同期的に実行されているので、最初のものが返される前にすべて送信される可能性があります。 – harmic

+0

@PeterMader forループでそれを持っていましたが、それぞれが少しうまく機能することがわかりました – Tfish

答えて

1

AJAXが$ .each関数を実行するとき、それはAJAX呼び出しを実行し、実行する関数を記述する必要がありますあなたの問題を解決するために

を完了するために他の人のために、「待たない」だろう、非同期であります最初のajax呼び出しで成功し、2回目のajax呼び出しで再度実行されます。

例:

var data = [form1,form2...etc]; 
function letsLoop(data,index = 0){ 
    $.ajax({ 
     url:.... 
     success: function(){ 
      letsLoop(data,index+1); 
     }, 
     error: function(){ 

     } 
    }); 
} 

とここにあなたの関数を呼び出す:

letsLoop(data,0); 
+0

これは本当にうまくいった! – Tfish

+0

私は助けることができる嬉しい:) – Sletheren

1

ループの外に分割することによって、あなたのエラーハンドラでreturnを意味する場合は、それはと思うように、それは動作しません。

ループは非同期要求を「一度に」作成します。これらの要求のそれぞれはブラウザによって処理され(多かれ少なかれ)、応答が返されます。したがって、エラーハンドラが実行されるまでにループは長く終了しています。

ところで、あなたのケースでの返品は、ループ内の関数ではなく、エラーハンドラに関連しています。

だから、あなたが望むものを達成するためには、AJAXリクエストを「キューに入れて」、それを1つずつ実行する必要があります。

考えられる解決策の1つは、フォームの配列を作成し、最初のものを取り出して(配列から取り除く)、応答で要求を実行し、全体を繰り返し、配列が空になるまで繰り返し続けます。

関連する問題