UNPKG

@canlooks/ajax

Version:
98 lines (97 loc) 2.48 kB
/** * 查找请求体中的Blob对象 * @param body */ export function findBodyFiles(body) { if (body instanceof Blob) { return body; } if (typeof body === 'object' && body !== null) { for (const k in body) { const file = findBodyFiles(body[k]); if (file) { return file; } } } return; } /** * 合并配置 * @param config */ export function mergeConfig(...config) { return config.reduce((prev, next) => { return { ...prev, ...next, url: mergeUrl(prev.url, next.url), params: mergeParams(prev.params, next.params), headers: mergeHeaders(prev.headers, next.headers), signal: mergeSignal(prev.signal, next.signal) }; }); function mergeUrl(prev, next) { if (prev instanceof URL) { prev = prev.href; } if (next instanceof URL) { next = next.href; } if (!prev) { return next; } if (!next) { return prev; } if (/^([a-z]+:)?\/\//i.test(next)) { return next; } prev = prev.replace(/\/+$/, ''); next = next.replace(/^\/+/, ''); return `${prev}/${next}`; } function mergeParams(prev, next) { const params = new URLSearchParams(prev); if (!(next instanceof URLSearchParams)) { next = new URLSearchParams(next); } if (!prev) { return next; } if (!next) { return params; } for (const [name, value] of next) { params.set(name, value); } return params; } function mergeHeaders(prev, next) { const headers = new Headers(prev); if (!(next instanceof Headers)) { next = new Headers(next); } if (!prev) { return next; } if (!next) { return headers; } for (const [name, value] of next) { headers.set(name, value); } return headers; } function mergeSignal(prev, next) { if (!prev) { return next; } if (!next) { return prev; } const abortController = new AbortController(); prev.onabort = next.onabort = () => abortController.abort(); return abortController.signal; } }