124 lines
3.5 KiB
JavaScript
124 lines
3.5 KiB
JavaScript
import baseRequest from "./baseRequest";
|
|
import { get } from "./storeInfo";
|
|
import { Toast } from "antd-mobile";
|
|
// import { useRouter } from "next/navigation";
|
|
// import webviewBaseRequest from "@/utils/webviewBaseRequest";
|
|
|
|
// 创建一个封装 fetch 的函数
|
|
export default function customFetch(
|
|
method,
|
|
url,
|
|
options = {},
|
|
needMid,
|
|
timeoutValue = 0
|
|
) {
|
|
const controller = new AbortController();
|
|
const signal = controller.signal;
|
|
|
|
// 设置超时
|
|
|
|
let timeout = null;
|
|
if (timeoutValue) {
|
|
timeout = setTimeout(() => {
|
|
controller.abort("Request timed out");
|
|
}, timeoutValue);
|
|
}
|
|
const base = baseRequest();
|
|
// 默认选项
|
|
const defaultOptions = {
|
|
method: method,
|
|
signal,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"X-Req-Source-TF": "wittgenstein",
|
|
...options?.headers,
|
|
// 可以添加其他默认头部信息
|
|
},
|
|
// 可以添加其他默认选项
|
|
};
|
|
let newBody = { ...options?.body };
|
|
if (needMid) {
|
|
let mid = get("account")?.mid;
|
|
if (!mid) return;
|
|
newBody.mid = mid;
|
|
}
|
|
const body = JSON.stringify({ ...base, ...newBody });
|
|
|
|
// 合并选项
|
|
const mergedOptions = { ...defaultOptions, body };
|
|
// console.log("body", body);
|
|
// 返回 Promise 对象
|
|
return new Promise((resolve, reject) => {
|
|
fetch(url, mergedOptions)
|
|
.then((response) => {
|
|
if (timeout) clearTimeout(timeout);
|
|
// // 检查响应状态码
|
|
if (!response.ok) {
|
|
throw new Error("Network response was not ok " + response.statusText);
|
|
}
|
|
|
|
// const contentLength = response.headers.get("Content-Length");
|
|
// if (!contentLength) {
|
|
// throw new Error("Content-Length is null");
|
|
// }
|
|
|
|
// const total = parseInt(contentLength, 10);
|
|
// let loaded = 0;
|
|
const reader = response.body.getReader();
|
|
const stream = new ReadableStream({
|
|
start(controller) {
|
|
function push() {
|
|
reader
|
|
.read()
|
|
.then(({ done, value }) => {
|
|
if (done) {
|
|
controller.close();
|
|
return;
|
|
}
|
|
// loaded += value.byteLength;
|
|
// const progress = (loaded / total) * 100;
|
|
// console.log(`Progress: ${progress.toFixed(2)}%`);
|
|
controller.enqueue(value);
|
|
push();
|
|
})
|
|
.catch((error) => {
|
|
controller.error(error);
|
|
});
|
|
}
|
|
push();
|
|
},
|
|
});
|
|
const newResponse = new Response(stream);
|
|
return newResponse.json();
|
|
// 解析 JSON 响应
|
|
// return response.json();
|
|
})
|
|
.then((data) => {
|
|
// 解析成功,返回数据
|
|
resolve(data);
|
|
})
|
|
.catch((error) => {
|
|
if (error.name === "AbortError") {
|
|
// console.log("Fetch request timed out.");
|
|
Toast.show({
|
|
icon: "fail",
|
|
content: "请求超时,请检查网络后重试。",
|
|
position: "top",
|
|
});
|
|
// 这里可以实现重试逻辑
|
|
// fetchDataWithRetry();
|
|
} else {
|
|
console.error("Fetch error:", error);
|
|
}
|
|
// console.log("error", error);
|
|
// Toast.show({
|
|
// icon: "fail",
|
|
// content: error.toString(),
|
|
// position: "top",
|
|
// });
|
|
// 请求失败,拒绝 Promise
|
|
reject(error);
|
|
});
|
|
});
|
|
}
|