首頁>Club>
一個簡易的需求,點一個按鈕,則向伺服器請求資源,不作處理時,多次點選後會有很多個請求在等待。粗暴的解決方式是點一次就將按鈕disable掉。請問一下有沒有更好的辦法?
10
回覆列表
  • 1 # 程式碼大叔

    簡單的回答就是:不要重複傳送相同的Ajax請求!

    如何做到? 那就要有一定的經驗和邏輯處理能力

    Ajax 即“Asynchronous Javascript And XML”(非同步 JavaScript 和 XML),是指一種建立互動式網頁應用的網頁開發技術。Ajax 是一種在無需重新載入整個網頁的情況下,能夠更新部分網頁的技術。

    我們用一個例子來說明一下:

    現在要求每隔5秒鐘用Ajax去向後臺請求一次資料,並把資料放到ID為XX的DIV裡

    假設後臺訪問地址:http://127.0.0.1/getdata

    用jQuery外掛來舉例

    先說容易犯錯的可能性, 上程式碼:

    一眼看去, 沒毛病,頁面載入完成後開始每隔5秒利用Ajax去拿一次資料,並放到指定的DIV裡

    但實際執行的時候,因為各種原因(比如網路延遲),會導致上次資料沒Load到, 第2次請求又到時間了,結果開始出現重複請求

    嚴重的話簡直會排著隊在不停的請求都有可能!

    上面問題導致的最根本原因是沒考慮請求資料時有可能出現的延遲,我們來改進一下:

    程式碼比上面稍長,但它解決幾個問題:

    - 改用了setTimeout定時器,避免反覆傳送Ajax請求

    - 修改了下次取資料的機制, 變成當前這次請求資料完成後才開始計時5秒再執行下次請求資料

    這樣可以杜絕了重複傳送Ajax請求的需求

    當然了, 上次這個方法也還有瑕疵

    比如說當某次Ajax請求出錯時,每隔5秒請求就再也不會執行了,程式就此中斷

    解決辦法當然是有的,但已經是另一個話題了

    有了上面的例子, 題主的問題就好解決, 思路如下:

  • 2 # UnicornBoat

    請求由使用者控制的時候,容易發生重複。

    前端用變數控制

    為每個專用ajax設定一個boolean變數,當所代表的ajax啟動時設定為1,結束時設定為0。也就是說該ajax啟動的條件是這個變數為0。如果請求不被允許可以直接return也可以排隊,然後由setInterval來檢查,隊伍清空後要clearInterval。

    後端由cookie控制

    根據ajax發來的請求判斷是否同一個使用者的請求,可以由IP和cookie中的key來判斷,也可以由session判斷。該使用者上一個同類ajax未結束前可以返回錯誤,儘量不要在後端排隊。

  • 3 # 從頭開始自學java

    你的做法是在客戶端進行限制。

    客戶端方案

    在同一個頁面,也就是說使用者沒有離開某個頁面,那麼使用disabled的方式也是無可厚非的,並沒有什麼粗暴之說。

    為什麼會覺得這種方式不好呢?

    問題分析

    按照常理來說,同一個使用者在某一段時間內不應該對某個請求發起多次請求。

    不過很難界定多短算一段時間之內,特別是考慮到網路延遲等因素。

    也很難界定是否是使用者自己的操作。

    所以只要是在同一個介面,我們都認為使用者不應該多次操作。

    表單直接提交方式

    這是我非常不建議的方案,假如採用提交之後務必要跳轉到另外一個頁面,否則使用者重新整理當前頁面會導致重複提交。

    把請求結果快取下來

    如果使用者在某一段時間之內請求的是同一個URL,那麼可以把之前快取在客戶端的資料直接取出來展示。

    如果是當前頁面就告訴他請過多久再請求。

    像阿里巴巴那樣,當一段時間之內請求超過一定次數之後,就驗證使用者的合法性,比如輸入驗證碼。

    記住這是限制機器請求,不是限制正常使用者的無聊之舉。

    服務端快取

    客戶端可以快取,服務端自然也可以快取。

    使用者請求過的資料就快取起來,下次請求直接返回。

    評價

    你會發現你覺得暴力的方式才是這個世界上最完美的方式,假如你想採用其他方式,會發現需要大量工作,建議最好是在伺服器集中式處理,這樣可以一勞永逸。

  • 4 # 我就哼哈了

    兩個辦法

    其一是在ajax執行前加一個變數預設為false,ajax每次執行前都判斷變數是否為false,是的話就進入ajax,同時將變數賦值為true。這樣重複點選無法進入ajax執行程式碼中。最後在ajax成功,或者失敗都把變數設定回false,就可以實現

    其二是用jquery的ajaxprefilter,這個函式在每次ajax的時候都會進入。透過函式傳參,知道當前ajax的URL是什麼。這樣就能知道是不是重複請求,是的話,直接用ajaxprefilter傳回的jqxhr變數,abrot掉這個ajax請求就完了

  • 5 # 純潔的激進派

    到現在的ajax,由於js是單執行緒執行,控制起來要方便很多。一般用一個全域性變數控制。點選後判斷是否在提交中,如是,返回,如不是,設定控制變數為提交中。ajax觸發complete時,將控制變數設為非提交,可能的話,ajax呼叫加try...catch...,catch時也設定未非提交。

    伺服器端也可以一定程度上控制重複提交。比如介面路徑和引數和令牌組合產生簽名儲存在redis或者session中,再加上時間戳。一定間隔內,如果簽名相同,這返回提交重複錯誤。

  • 中秋節和大豐收的關聯?
  • 如何讓樹莓派快速產生大量的熱?