懒加载
/** 方法一 高度对比 **/
let imgs = [...document.querySelectorAll('img')]
window.addEventListener('scroll', function () {
lazyLoad(imgs)
})
function lazyLoad(imgs) {
for (let i = 0
let height = imgs[i].offsetTop
let wheight = window.innerHeight
let sheight = document.documentElement.scrollTop
if (height - sheight <= wheight) { // 判断图片是否将要出现
imgs[i].src = imgs[i].dataset.src
}
}
}
let imgs = [...document.querySelectorAll('img')];
window.addEventListener('scroll', function () {
imgs.forEach(img => {
if (img.getBoundingClientRect().top < window.innerHeight) {
let dataSrc = img.getAttribute(' data-src');
img.setAttribute('src', dataSrc);
console.log(img.src);
}
function query(selector) {
return Array.from(document.querySelectorAll(selector));
}
var observer = new IntersectionObserver(
function (entries, self) {
entries.forEach((item) => {
if (item.isIntersecting) {
let img = item.target
let src = img.dataset.src
if (src) {
img.src = src
img.removeAttribute('data-src')
}
self.unobserve(item.target)
}
})
query('.lazy-loaded').forEach(function (item) {
observer.observe(item);
});
})
无限滚动
var intersectionObserver = new IntersectionObserver(
function (entries) {
if (entries[0].intersectionRatio <= 0) return;
loadItems(10);
console.log('Loaded new items');
});
intersectionObserver.observe(
document.querySelector('.scrollerFooter')
);
并发限制延时执行
const fn = function (delay) {
return ['a', 'b', 'c'].map((current, i) => {
return new Promise(function (resolve, reject) {
setTimeout(() => {
console.log(current);
resolve()
}, i * delay)
})
})
}
Promise.all(fn(3000)).then(() => {
console.log('end')
})
并发限制数量
function multiRequest(urls = [], maxNum) {
const len = urls.length;
const result = new Array(len).fill(false);
let count = 0;
return new Promise((resolve, reject) => {
while (count < maxNum) {
fn();
}
function fn() {
let current = count++;
if (current >= len) {
!result.includes(false) && resolve(result);
return;
}
const url = urls[current];
console.log(`开始 ${current}`, new Date().toLocaleString());
fetch(url)
.then((res) => {
result[current] = res;
console.log(`完成 ${current}`, new Date().toLocaleString());
if (current < len) {
fn();
}
})
.catch((err) => {
console.log(`结束 ${current}`, new Date().toLocaleString());
result[current] = err;
if (current < len) {
fn();
}
});
}
});
}
multiRequest(['111', '222', '333', '444', '555', '666', '777'], 3)
无感刷新Token
import axios from 'axios'
import { MessageBox} from 'element-ui'
import api from './api'
let UserModule = {
setToken: (data) => {
window.sessionStorage.setItem('token', data.token)
},
getToken: () => window.sessionStorage.getItem('token'),
removeToken: () => {
window.sessionStorage.removeItem('token')
}
}
let isRefreshing = false;
let retryRequests = [];
const request = axios.create({
baseURL: api.baseUrl,
timeout: 50000,
withCredentials: true
})
request.interceptors.request.use(
(config) => {
if (UserModule.getToken()) {
config.headers['Authorization'] = UserModule.getToken()
}
return config
},
(error) => {
Promise.reject(error)
}
)
request.interceptors.response.use(
(response) => {
const res = response.data
if (res.code !== 0) {
if (res.message) {
alert(res.message);
}
return Promise.reject(res)
} else {
return response.data
}
},
(error) => {
if (!error.response) return Promise.reject(error)
if (error.response.data.code === 1002) {
const config = error.config
if (!isRefreshing) {
isRefreshing = true
return getTokenFun()
.then((res) => {
UserModule.setToken(res.data.data);
config.headers['Authorization'] = UserModule.getToken()
retryRequests.forEach((cb) => cb(UserModule.getToken()));
retryRequests = [];
config.baseURL = ''
return request(config)
})
.catch(() => {
resetLogin()
})
.finally(() => {
isRefreshing = false
})
} else {
return new Promise((resolve) => {
retryRequests.push((token: any) => {
config.baseURL = ''
config.headers['Authorization'] = token
resolve(request(config))
})
})
}
} else if (error.response.data.code === 1001) {
resetLogin()
} else {
alert( error.response.data.message);
return Promise.reject(error)
}
}
)
function getTokenFun() {
return axios.post(
api.baseUrl + 'auth-center/auth/refresh_token',
{old_token: UserModule.getToken() || ''}
)
}
function resetLogin(title = '身份验证失败,请重新登录!') {
if (window.location.href.indexOf('/login') === -1) {
MessageBox.confirm(title, '退出', {
confirmButtonText: '重新登录',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
UserModule.removeToken()
location.reload()
})
}
}
export {request}