@ryanuo/utils
Version:
提供多种实用工具函数,涵盖算法、浏览器操作、网络请求等多个领域
107 lines (106 loc) • 3.01 kB
JavaScript
async function fetchWithTimeout(url, options = {}, timeout = 5e3) {
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), timeout);
try {
const response = await fetch(url, {
...options,
signal: controller.signal
});
clearTimeout(timer);
return response;
} catch (err) {
clearTimeout(timer);
throw new Error(`\u8BF7\u6C42\u8D85\u65F6\u6216\u5931\u8D25: ${err.message}`);
}
}
async function request(method, url, data, headers = {}) {
const config = {
method,
headers: { "Content-Type": "application/json", ...headers }
};
if (data)
config.body = JSON.stringify(data);
const response = await fetchWithTimeout(url, config);
if (!response.ok)
throw new Error(`HTTP\u9519\u8BEF ${response.status}`);
return response.json();
}
async function parallelRequests(requests, concurrency = 5) {
const results = [];
const executing = /* @__PURE__ */ new Set();
for (const req of requests) {
const p = req().then((res) => {
results.push(res);
executing.delete(p);
});
executing.add(p);
if (executing.size >= concurrency)
await Promise.race(executing);
}
await Promise.all(executing);
return results;
}
async function getClientIP() {
try {
const response = await request(
"GET",
"https://api.ipify.org?format=json"
);
return response.ip;
} catch {
return "unknown";
}
}
async function getIndexedDBCache(dbName, storeName) {
const openDB = () => {
return new Promise((resolve, reject) => {
const request2 = indexedDB.open(dbName, 1);
request2.onupgradeneeded = () => {
request2.result.createObjectStore(storeName);
};
request2.onsuccess = () => resolve(request2.result);
request2.onerror = reject;
});
};
const db = await openDB();
return {
async get(key) {
return new Promise((resolve) => {
const tx = db.transaction(storeName, "readonly");
const store = tx.objectStore(storeName);
const request2 = store.get(key);
request2.onsuccess = () => resolve(request2.result);
request2.onerror = () => resolve(void 0);
});
},
async set(key, value) {
return new Promise((resolve, reject) => {
const tx = db.transaction(storeName, "readwrite");
const store = tx.objectStore(storeName);
const request2 = store.put(value, key);
request2.onsuccess = () => resolve();
request2.onerror = reject;
});
}
};
}
function checkNetworkStatus() {
return new Promise((resolve) => {
if (navigator.onLine !== void 0) {
resolve(navigator.onLine);
} else {
const img = new Image();
img.onload = () => resolve(true);
img.onerror = () => resolve(false);
img.src = `https://www.google.com/favicon.ico?${Date.now()}`;
}
});
}
export {
checkNetworkStatus,
getIndexedDBCache,
getClientIP,
parallelRequests,
fetchWithTimeout,
request
};