2013-04-25 107 views
0

如果我不真正關心響應,我不想掛上瀏覽器,我該如何中止Ajax調用?Ajax調用掛起瀏覽器 - 我不關心迴應

情況是我有一個ajax調用,可能會在某些情況下觸發服務器發送超過1000封電子郵件。 99%的時間只有幾封或幾封電子郵件。 因此,通過1000個電子郵件ajax調用,瀏覽器在獲取成功消息之前有時會等待5分鐘,因此用戶必須等待。

我已經嘗試設置超時,但這仍然掛起。我想等待約20秒鐘,然後放棄等待響應。

var request = jQuery.ajax({ 
     type: "post",url: "admin-ajax.php", 
     data: { 
      action: 'send_email', 
      emailHTMLMessage: tinyMCE.activeEditor.getContent(),    
      _ajax_nonce: '<?php echo $nonce; ?>' 
     }, 
     timeout: 20000, //Set your timeout value 
     success: function(html){ //so, if data is retrieved, store it in html 
      window.scrollTo(0,0); 
      sendResults(html); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      if(textStatus==="timeout") { 
       <... I'd redirect to another html page here....> 
      } else { 
       alert("Another error was returned"); //Handle other error type 
      } 
     } 
}); //close jQuery.ajax 

我試過request.abort(),但是這會立即殺死它,服務器永遠不會收到send_email消息。

當服務器繼續做這件事情時,我該如何靜靜地忽略20secs之後的響應?

+0

Ajax調用是異步的,所以你的瀏覽器不會被阻塞,也不需要等待任何東西。你可以放空成功。即使你在瀏覽器中離開,你的服務器腳本已經啓動,並可以使用'ignore_user_abort'和一個好的'set_time_limit'來完成它的工作:) – MatRt 2013-04-25 21:40:50

回答

0

在這篇文章中有當場打死辦法keet http請求後運行腳本結束:

Can a PHP script start another PHP script and exit?

所以你可以讓你的電子郵件腳本在服務器上運行。

如果你想知道你的狀態,你可以讓你的電子郵件腳本更新到一個mysql表中發送多少封電子郵件,並用ajax請求檢查mysql表中的計數。

0

如果您發送1000封電子郵件,那麼無論您做什麼,該電話都會包含一些開銷。您還必須等到所有信息都發送到服務器,然後才允許用戶離開頁面。

我的建議是更改服務器代碼以便在服務器收到請求後立即響應。這樣客戶端就不會在服務器上等待完成發送整個批處理,而只是等待服務器接收到它們的請求。

+0

服務器在這裏完成繁重的工作,所有的Ajax調用確實是發送電子郵件的內容,並且我已經在羣發電子郵件發送之前嘗試了響應,例如,在PHP中: '//報告一切正常! echo'emailSuccess'; //發送...... $ this-> send_newsletter($ email_data,$ subscribers); } else { echo'Fail'; } die();' – sw19womble 2013-04-25 21:54:38

+0

但不是立即發送電子郵件,您也可以將它們存儲在數據庫中並使用cron作業批量發送。另請注意,PHP的mail()函數並不是發送大量電子郵件的最佳工具。 – Arjan 2013-04-25 21:58:16

0

只需發佈而不使用成功,超時或錯誤回調。

你可能想嘗試創建爲每個電子郵件新的GET請求:

for(i = 0; i<1000; i++){ 

    var request = $.ajax({ 
     type: "post", 
     url: "admin-ajax.php", 
     data: {'i':'nada'} 
    }); 

}; 

在這種情況下,我用一個for循環,但你也可以用電子郵件的數組:

var emails = new Array(1000); 

$.each(emails, function(){ 

    var request = $.ajax({ 
     type: "post", 
     url : "admin-ajax.php", 
     data: {'i':'nada'} 

    }); 

}); 
+0

我試過這個,但瀏覽器仍然掛起,直到所有的電子郵件都在服務器上發送。 – sw19womble 2013-04-25 21:53:15

相關問題