簡體   English   中英

如果用戶中止連接到服務器(連接時刷新,關閉瀏覽器等),如何停止執行所有功能(多個異步等)。

[英]How to stop all functions (multiple asyncs etc) from executing if user abort connecting to the server (refresh while connecting, close browser, etc..)

我目前正在使用React.js和服務器端渲染,其中有多個異步調用從API服務器請求json。 因此,問題在於,如果用戶停止連接,即使沒有人提供服務,功能也會繼續執行。

例如,如果我按下刷新按鈕,則node.js Express服務器將繼續發送數百個異步請求(可能還需要花費更長的時間來執行非異步功能),然后在收到響應后立即執行功能。

所以基本上我需要一些方法來阻止用戶停止HTTP請求時觸發功能,最糟糕的情況是按住刷新按鈕時...

我嘗試使用res.end(),但函數不斷觸發。 有什么聰明的方法可以監聽事件並停止異步或其他操作嗎?

請求通過“ superagent”發出,並通過“ async.js”異步發出

謝謝。

服務器上沒有特別適合您的選擇。

如果單個客戶端從服務器發出多個請求,然后在處理請求或在服務器隊列中等待處理時,最終用戶將單擊“刷新”,那么瀏覽器將丟棄/關閉當前打開的Ajax套接字。打開網頁了。

但是,已經在服務器上進行的請求將繼續處理,並且服務器甚至在服務器嘗試寫入這些套接字之前都不知道那些套接字已經關閉。 此時,可能(取決於時間)發現插座已關閉。 但是,當然到那時,您已經處理了請求並准備好結果。 還可能在服務器甚至不知道套接字已關閉之前就處理並發送了請求。 當等待確認發送的數據時,另一端沒有響應,或者另一端關閉又返回,這將最終在套接字上導致錯誤(並導致套接字的關閉)(因為TCP是一個可靠的協議,每次發送都必須在連接的另一端進行確認)。

因此,所有這些都解釋了為什么在服務器上實際上沒有很多可以做的事情。


如果客戶端並行發送多個API請求,並且最終用戶以某種方式導致在頁面中間刷新頁面,則您描述的情況將會惡化。 您可以采取以下措施來減輕此問題:

  1. 將多個請求合並為一個API請求。 如果您的API已經允許這種類型的請求結構,請切換到該結構。 或者,如果您控制API,則向API添加新功能,以便與其讓客戶端並行發送多個請求,不如讓客戶端發送單個請求並獲取該請求中的所有數據。 這限制了在關閉網頁時可能被處理的請求的數量。

  2. 限制您發送的並行請求數。 您可以通過使用異步庫功能來執行此操作,該功能可控制要發送的請求列表中一次發送的請求數量,或者可以序列化請求,以便僅在前一個請求完成后才發送請求。 這也將限制在關閉網頁時可能被處理的請求數。

  3. 如果您在服務器端進行了特別昂貴的操作(可能需要花費幾分鍾的時間才能運行,例如構建大型報告文件),則可以設計與客戶端的某種簽入,然后在處理過程中檢查一下是否客戶端仍處於活動狀態,如果沒有,則可以中止自己的服務器端處理。 對於大多數普通類型的服務器端請求,這可能不值得付出額外的麻煩(因為驗證客戶端仍處於活動狀態需要自己承擔費用),但是如果您的服務器端操作成本特別高,則可以實現類似這個。

  4. 如果您在請求處理有異步操作,如果你願意把支票存入您的請求處理每個異步操作后,那么你可以在注冊一個偵聽器'close'req.connection.addListener('close', function () { ... }); ,然后在每次異步操作后檢查該請求的請求上設置某種標志,然后在發現該連接上的該標志時中止其余請求處理。 我在net模塊文檔中搜索了套接字對象上的一些標志或方法,這些標志或方法會告訴您它是否已關閉(此類信息應該存在),但在nodejs文檔中找不到它。

中途中止請求不是async的工作。 async的角度來看,對服務器的請求只是一個單獨的任務,無法進一步拆分。 如果可以執行這樣的操作,則它將成為內置http模塊或express 但是我不確定這是否會很有幫助,即使有辦法可以做到。 您嘗試取消發送請求時,請求可能已到達Internet。 您真正想要的是首先不要發送太多請求。

您尚未發布任何代碼,因此我無法對您的代碼進行修改。 而不是讓事件處理程序顯示“發送請求並對響應進行某種處理”,而是寫一個“如果您在最近2秒鍾內未發送請求,則發送一個對響應進行處理,然后將響應保存在變量中;否則,請查看變量的值,並假裝您已將其作為響應接收”。 (我假設所有請求都是相同的-如果不完全相同,那么您需要多考慮一下。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM