zhangxiao
2024-08-26 57b66478e7e335379435b31c20da4619bd1411f5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
type RetryData = {
    fn: (params?: any) => Promise<any>;
    params?: any;
    limit?: number;
    delay?: number;
};
 
export default function (data: RetryData): Promise<any> {
    !data.limit && (data.limit = 3);
    !data.delay && (data.delay = 50);
    return new Promise((resolve, reject) => {
        const attempt = async (): Promise<any> => {
            try {
                const res = await data.fn(data.params);
                resolve(res);
            } catch (e) {
                if (data.limit) {
                    data.limit--;
                }
                if (!data.limit) {
                    reject(e);
                } else {
                    setTimeout(() => {
                        attempt();
                    }, data.delay);
                }
            }
        };
        attempt();
    });
}