function retryDecorator(maxRetries = 3, delay = 1000) {
return function (target, propertyKey, descriptor) {
const originalMethod = descriptor.value;
descriptor.value = async function (...args) {
let retries = 0;
while (retries < maxRetries) {
try {
return await originalMethod.apply(this, args);
} catch (error) {
retries++;
console.log(`重试次数: ${retries}`);
if (retries === maxRetries) {
throw error;
}
await new Promise(resolve => setTimeout(resolve, delay));
}
}
};
return descriptor;
};
}
async function fetchData() {
await new Promise(resolve => setTimeout(resolve, 1000));
throw new Error('模拟错误');
}
const decoratedFetchData = retryDecorator()(fetchData, 'fetchData', { value: fetchData });
decoratedFetchData().catch(console.error);