在使用 Promise.race
时,如果网络中断,通常会导致请求失败,并触发相应的错误处理。这可以通过 Promise.race
中的 Promise 对象来捕获。以下是如何处理网络中断的详细说明。
1. 网络中断的处理
当网络中断时,uni.request
、uni.uploadFile
和 uni.downloadFile
的 fail
回调会被触发,你可以在这些回调中拒绝 Promise,并在 Promise.race
的 catch
方法中处理这个错误。
示例代码
以下是一个包含网络中断处理的 Promise.race
示例,适用于文件上传和下载。
1.1 文件上传示例
function uploadFile(file) {
const requestTimeout = 5000; // 设置超时时间为 5 秒
const uploadPromise = new Promise((resolve, reject) => {
uni.uploadFile({
url: 'https://example.com/upload',
filePath: file.path,
name: 'file',
formData: {
otherData: 'value'
},
success: (res) => {
if (res.statusCode === 200) {
resolve(res.data);
} else {
reject(new Error('服务器错误: ' + res.statusCode));
}
},
fail: (error) => {
reject(new Error('上传失败: ' + error.errMsg)); // 网络中断时会触发这里
}
});
});
const timeoutPromise = new Promise((_, reject) => {
setTimeout(() => {
reject(new Error('上传超时'));
}, requestTimeout);
});
Promise.race([uploadPromise, timeoutPromise])
.then((data) => {
console.log('上传成功:', data);
})
.catch((error) => {
if (error.message === '上传超时') {
console.error('请求超时');
} else {
console.error('请求失败或网络中断:', error.message);
}
});
}
1.2 文件下载示例
function downloadFile(url) {
const requestTimeout = 5000; // 设置超时时间为 5 秒
const downloadPromise = new Promise((resolve, reject) => {
uni.downloadFile({
url: url,
success: (res) => {
if (res.statusCode === 200) {
resolve(res.tempFilePath);
} else {
reject(new Error('服务器错误: ' + res.statusCode));
}
},
fail: (error) => {
reject(new Error('下载失败: ' + error.errMsg)); // 网络中断时会触发这里
}
});
});
const timeoutPromise = new Promise((_, reject) => {
setTimeout(() => {
reject(new Error('下载超时'));
}, requestTimeout);
});
Promise.race([downloadPromise, timeoutPromise])
.then((filePath) => {
console.log('下载成功:', filePath);
})
.catch((error) => {
if (error.message === '下载超时') {
console.error('请求超时');
} else {
console.error('请求失败或网络中断:', error.message);
}
});
}
2. 总结
在 Promise.race
中,如果发生网络中断,相关的请求 Promise 会被拒绝,并进入到 catch
方法中。