2014-10-31 60 views
1

我想發送電子郵件給> 2000個收件人。我做了一個發送50封電子郵件的ajax電話,我想重複它,直到所有電子郵件都會發送。 PHP函數返回一個包含3個索引,成功(計數成功郵件),失敗(計數失敗郵件)和完成(確定不再有電子郵件存在)的數組。因此,我會收到電子郵件數量,然後使用計數器(i)確定發送的電子郵件數量。當我> =計數時,我想斷開循環。這裏是我的代碼:在jquery中爲ajax調用循環

function sendEmailStepByStep(imageAddress, counts) { 
    $(".feature div").append("<br />Please wait...<div class='feature_process'>&nbsp;</div>" + "<div class='feature_message'>Success: <span id='success_email'>0</span>, Failed: <span id='failed_email'>0</span></div>"); 

    var i = 0; 
    timer = setTimeout(function() { 
     $.ajax({ 
      type: "GET", 
      url: "", 
      dataType: 'json', 
      data: { 
       group: 'packages', 
       do :'emailPackageUsingAjax', 
       image: imageAddress, 
       num: i 
      } 
     }).done(function (response) { 
      console.log('success'); 
      console.log(response); 
      $("#success_email").html(response.Success); 
      $("#failed_email").html(response.Failed); 
      i = i + response.Success + response.Failed; 
      if (i > counts || response.Finish == 'true') { 
       clearTimeout(timer); 
      } 
     }).fail(function (response) { 
      $(".feature_message").append(response.responseText); 
      console.log("error"); 
      console.log(response); 
      clearTimeout(timer); 
     }) 
    }, 1000); 
} 

爲什麼這隻被稱爲一次?

+0

我沒有得到一個setInterval,我看到一個setTimeout ...爲什麼它會運行多次 – Ohgodwhy 2014-10-31 09:14:54

+0

在哪裏我必須添加間隔? – 2014-10-31 09:15:52

+1

http://www.w3schools.com/jsref/met_win_setinterval.asp反對http://www.w3schools.com/jsref/met_win_settimeout.asp Timeout在一段時間後調用代碼,間隔反覆調用它 – Kyborek 2014-10-31 09:16:34

回答

3

而不是使用的setTimeout或setInterval的,我會建議像這樣的:

function sendEmailStepByStep(imageAddress, counts) { 
$(".feature div").append("<br />Please wait...<div class='feature_process'>&nbsp;</div>" + "<div class='feature_message'>Success: <span id='success_email'>0</span>, Failed: <span id='failed_email'>0</span></div>"); 

var i = 0; 
var mailer = function() {  // Create internal function instead of timer 
    $.ajax({ 
     type: "GET", 
     url: "", 
     dataType: 'json', 
     data: { 
      group: 'packages', 
      do :'emailPackageUsingAjax', 
      image: imageAddress, 
      num: i 
     } 
    }).done(function (response) { 
     console.log('success'); 
     console.log(response); 
     $("#success_email").html(response.Success); 
     $("#failed_email").html(response.Failed); 
     i = i + response.Success + response.Failed; 
     if (i < counts && response.Finish != 'true') { 
      mailer();  // if count is less and not finished, invoke function again 
     } 
    }).fail(function (response) { 
     $(".feature_message").append(response.responseText); 
     console.log("error"); 
     console.log(response); 
    }) 
}; 

mailer();  // First invocation of function 
} 

使用上述技術將確保下一批僅當上一個完成,甚至當它超過1秒發送,因爲你在超時設置。