2016-03-25 15 views
0

私は、メールを送信するスクリプトにajax要求を行うことによって、多くの受信者にニュースレターメールを送信しようとしています。以前のリクエストが完了したことを確認するために(ブラウザの同時リクエストの最大数に達しないように)、私は再帰的ループ関数を使用します。再帰的ループによる同期ajax要求

この質問には複数のバリエーションがありますが、私は私を助けてくれる回答は見つかりませんでした。

var receiverarray = <?php echo json_encode($receiverarray); ?>; // All data is correctly received from PHP 
var nrofreceivers = '<?php echo count($receiverarray); ?>'; 
nrofreceivers = parseInt(nrofreceivers); 
function sendmailreceivers(receiverarray, callback) { 
    try { 
     var a = 0; 
     recur_loop(a); 
     function recur_loop(i) { 
      var num = i; 
      if (num < nrofreceivers) { 
       var count = num + 1; 
       var percentage = (count/receiverarray.length) * 100; 
       percentage = Math.round(percentage); 
       var loadingtext = String(count) + " van " + String(nrofreceivers) + " (" + String(percentage) + "%)"; 
       $('#loadingtext').html(loadingtext); 
       var thisreceiverarray = receiverarray[num]; 
       $.ajax({ 
        type: "POST", 
        url: "https://www.domain.com/scripts/sendmail.php", // Script works fine 
        data: { 
         'from_mail': '<?php echo $webmastermailaddress; ?>', 
         'from_name': 'Webmaster name', 
         'to_mail': thisreceiverarray.email, 
         'to_name': thisreceiverarray.name, 
         'reply_name': 'Business name', 
         'reply_mail': 'Business mail address', 
         'diff_mailer': '', 
         'mail_content': '<HTML>The html mail content</HTML>', 
         'mail_subject': '<?php echo $subject; ?>' 
        }, 
        success: function(){ 
         recur_loop(count); 
        }, 
        error: function() { 
         throw "Error!"; 
        } 
       }); 
      } 
     }; 
     callback(); 
    } 
    catch(err) { 
     throw "Error!"; 
    } 
} 

これは最初の3つのメールアドレスのため正常に動作します:私が試した何

。次に、未知の理由で関数が終了し、コールバックが次の関数が実行されることを確認します(ここで私はユーザーをありがとうページにリダイレクトします)。

関数はエラーなく終了するので、すべてのメールが送信されたように見えますが、実際には3つのメールのみが送信されます。

私はすでに回答を探して解決しようと多くの日を費やしましたが、運がありません。コンソールにエラーはありませんか?

機能が途中で終了するのはなぜですか?

+0

コードは、シミュレートされた要求に対して期待どおりに機能するように見えます。デベロッパーコンソールの[ネットワーク]タブには何が表示されますか?いくつのリクエストが実際に送信されますか?サーバー側で問題が発生している可能性があります。つまり、要求は送信されていますが、メールサーバーによって処理されていませんか?それ以上の詳細がなければ、誰もができることは推測です。 – Roberto

答えて

1

私はあなたのコードを少し改善しようとした、それはまだ完璧ではない:

var receiverarray = <?php echo json_encode($receiverarray); ?>; 

function sendmailreceivers(callback) { 
    try { 
     recur_loop(0); 
     function recur_loop(i) { 
      if (i === receiverarray.length) { 
       return callback(); 
      } 
      var percentage = Math.round((i/receiverarray.length) * 100); 
      var loadingtext = i + " van " + receiverarray.length + " (" + percentage + "%)"; 
      $('#loadingtext').text(loadingtext); 
      var thisreceiverarray = receiverarray[i]; 
      $.ajax({ 
       type: "POST", 
       url: "https://www.domain.com/scripts/sendmail.php", // Script works fine 
       data: { 
        'from_mail': '<?php echo $webmastermailaddress; ?>', 
        'from_name': 'Webmaster name', 
        'to_mail': thisreceiverarray.email, 
        'to_name': thisreceiverarray.name, 
        'reply_name': 'Business name', 
        'reply_mail': 'Business mail address', 
        'diff_mailer': '', 
        'mail_content': '<HTML>The html mail content</HTML>', 
        'mail_subject': '<?php echo $subject; ?>' 
       }, 
       success: function(){ 
        recur_loop(i + 1); 
       }, 
       error: function(err) { 
        callback(err); 
       } 
      }); 
     } 
    } catch(err) { 
     callback(err); 
    } 
} 

sendmailreceivers(function(err) { 
    if (err) { 
     console.error(err.stack); 
     alert('Error!'); 
    } else { 
     alert('Done'); 
    } 
}); 

いくつかの発言:

  • 最初の要求が
  • try { ... } catch(err) { throw "Error"; }意志を完了する前に、あなたがcallbackと呼ばれます意味のあるエラーメッセージを飲み込んで「エラー」に置き換えてください。あまり役に立ちません。
  • strは、テキスト、HTMLコードではない
  • が含まれている場合、それはコールバック関数は、可能性のあるエラーを返すための最初の引数としてerrを追加するために、一般的には良いアイデアだ代わり.htmlをより有効に利用.text(str)
  • String(val)parseInt(val, 10)は、あなたがそれを使用する前に、変数のすべてを保存する必要がない古いPHPのバージョンよりも
  • その他の値の型を変換するだけで必要です。例えば、関数の戻り値を引数として渡すことは、まったく問題ありません。
+0

なぜ答えはありませんか? 'あなたは最初のリクエストが完了する前にコールバックを呼び出しました.'そして、すべてのリクエストが完了した後にコールする方法をコード化しましたか? – user3173842

+0

こんにちはすべて、お返事いただきありがとうございます!私は明日それを試し、あなたに知らせるでしょう。 –

+0

それは働いている!特にこの部分は解決策でした: 'if(i === receiverarray.length){ return callback(); } ' ありがとう! –

関連する問題