這個異步問題你肯定遇到過,但是會解決的并不多
大家肯定遇到過這樣類似的場景:多個 Tab 頁點擊切換功能,如果用戶點擊頻繁,很可能會出現(xiàn)當前頁面顯示別的頁面的數(shù)據(jù)。
因為每個接口返回信息的時間是不同的,你不能保證先請求的一定最先返回數(shù)據(jù),那么就很可能會出現(xiàn)停留在頁面一卻出現(xiàn)別的頁面的數(shù)據(jù)的情況。這種異步的情況術語稱之為異步競態(tài)。
這時肯定有讀者會說了,這還不簡單,我能給你輕松想出好幾個解決辦法。
節(jié)流、防抖、加 Loading!
這些做法固然能解決問題,但是都治標不治本,而且還影響了用戶體驗,其實還有種辦法能夠完美解決問題:取消請求。
當然了這個取消請求它只是不繼續(xù)處理接口后續(xù)的響應了,并不是真的把請求給取消了。畢竟請求如果已經發(fā)出去的話,我們也不能順著網線把它追回來。
我們這邊以 axios 為例來看看怎么取消請求:
- const CancelToken = axios.CancelToken;
- const source = CancelToken.source();
- axios.get('/user/12345', {
- cancelToken: source.token
- }).catch(function (thrown) {
- if (axios.isCancel(thrown)) {
- console.log('Request canceled', thrown.message);
- } else {
- // handle error
- }
- });
- axios.post('/user/12345', {
- name: 'new name'
- }, {
- cancelToken: source.token
- })
- // cancel the request (the message parameter is optional)
- source.cancel('Operation canceled by the user.');
用法還是挺簡單的,對于可能會出現(xiàn)異步競態(tài)的情況下大家可以采用這個方法來解決。簡單好用,還不會影響用戶體驗,封裝下代碼就能用起來了。