在使用 Promise.race
处理超时和服务器返回错误时,可以通过对错误对象的类型进行区分来判断是超时还是其他请求错误。下面是具体的实现方法。
function uploadFile(file) {
const formData = new FormData();
formData.append('file', file); // 添加文件
formData.append('otherData', 'value'); // 添加其他数据
const requestTimeout = 5000; // 设置超时时间为 5 秒
// 创建上传文件的 Promise
const uploadPromise = new Promise((resolve, reject) => {
uni.request({
url: 'https://example.com/upload', // 服务器上传接口
method: 'POST',
header: {
'Content-Type': 'multipart/form-data' // 设置请求头
},
data: formData,
success: (res) => {
// 判断状态码来确认是否成功
if (res.statusCode === 200) {
resolve(res.data);
} else {
// 服务器返回错误
reject(new Error('服务器错误: ' + res.statusCode));
}
},
fail: (error) => {
// 网络错误或者请求失败
reject(new Error('请求失败: ' + error.errMsg));
}
});
});
// 创建超时的 Promise
const timeoutPromise = new Promise((_, reject) => {
setTimeout(() => {
reject(new Error('上传超时'));
}, requestTimeout);
});
// 使用 Promise.race 来处理超时和成功/失败
Promise.race([uploadPromise, timeoutPromise])
.then((data) => {
console.log('上传成功:', data);
})
.catch((error) => {
if (error.message === '上传超时') {
console.error('请求超时');
} else {
console.error('请求失败或服务器错误:', error.message);
}
});
}
res.statusCode
,如果是 200,表示成功,解析数据;如果不是,拒绝并返回服务器错误信息。error.message
判断具体错误类型,分别处理。通过这种方式,你可以清晰地区分超时和服务器返回的错误信息,从而在用户界面上提供相应的反馈。