最近老項目會員中心上報了一個問題,報錯以下:javascript
部分用戶在登陸時會出現報錯的狀況,出現頻率大概是每三天有一兩個。 根據報錯,很明顯是setItem的問題。查看web docs沒有說有兼容性問題java
繼續瞭解,發現localstorage對ios11如下隱私模式有兼容問題,調用setItem會報錯。即ios11如下的隱私模式不支持localstorageios
思路是在不兼容的瀏覽器(模式)下使用cookies來替代localstorageweb
const _isLocalStorageSupported = function() {
try {
window.localStorage.setItem('test', 1)
window.localStorage.removeItem('test')
return true
}catch(err) {
return false
}
}
const getStorage = function(key) { ///localStorage.getItem / cookies
let res = ''
if(_isLocalStorageSupported()) {
res = window.localStorage.getItem(key)
}else { ///cookie
let name = `${key}=`
let ca = document.cookie.split(';')
for(let i=0; i<ca.length; i++) {
let c = ca[i].trim()
if (c.indexOf(name) === 0) {
res = c.substring(name.length, c.length)
}
}
}
return res
}
const setStorage = function(key, val) { ///localStorage.setItem / cookies
if(_isLocalStorageSupported()) {
window.localStorage.setItem(key, val)
}else { ///cookie
let d = new Date();
d.setTime(d.getTime()+(30*24*60*60*1000));
let expires = `expires=${d.toGMTString()}`;
document.cookie = `${key}=${val}; ${expires}`;
}
}複製代碼
封裝set和get的全局公共方法promise
關於爲啥 unhandled promise rejection 我有點不理解瀏覽器
我是作了catch處理的,這個setItem是在.then()回調裏執行的,應該被正常catch而不至於最後被進程捕獲。很奇怪,有沒有大佬知道緣由的,歡迎評論告訴我,謝謝。cookie