javascript повторить асин c жду - PullRequest
1 голос
/ 02 марта 2020

У меня есть несколько асинхронных c функций, которые все отправляют запрос на сервер, и если возникает ошибка, они перехватывают ее, затем повторяют функцию, эти функции полагаются на данные из предыдущей функции, поэтому они должны отправить одна за другой проблема заключается в том, что всякий раз, когда я вызываю эти функции, и возникает ошибка, она продолжает повторять ее, как я хочу, но затем переходит к следующей функции, вместо того, чтобы ждать, пока предыдущая вернет разрешенный ответ.

const request1 = async () => {
    try {
        const data = await rp.get(link, options)
        return data
    } catch (err) {
        request1()
    }

}

const request2 = async (data) => {
    try {
        const data = await rp.get(link, options)
        return data
    } catch (err) {
        request2()
    }

}

const getData = async() => {
await request1()
await request2()

})

getData()

всякий раз, когда я вызываю функцию getData (), он ожидает первый запрос, но даже если он имеет ошибку, он переходит ко второму запросу сразу после, вместо ожидания разрешения первого запроса Кроме того, мне нужно перехватить попытку для всех запросов, которые я отправляю, вместо одного, потому что, если есть ошибка, я просто хочу повторить этот шаг, а не полную

Ответы [ 2 ]

3 голосов
/ 02 марта 2020

Вы не отвечаете на повторный вызов

const request1 = async () => {
    try {
        const data = await rp.get(link, options)
        return data
    } catch (err) {
        return await request1(); // i'm not sure if you need await here or not, worth testing
    }

}

Если вы не возвращаетесь с повторного вызова, то то, что вы делаете, по сути идентично этому

const request1 = async () => {
    try {
        const data = await rp.get(link, options)
        return data
    } catch (err) {
        request1(); // this does request 1 WITHOUT waiting for a result
    }
    return undefined;    
}

Редактировать: это первый игрушечный пример того, что происходит, если вы ничего не возвращаете

const rp = {
    get: async function() {
        await new Promise(r => setTimeout(r, 250));
        this.count++;
        if (this.count % 2 === 0) {
            return this.count;
        } else {
            throw new Error('error: even')
        }
    },
    count: 0
};

const request1 = async () => {
    try {
        const data = await rp.get();
        console.log('data in request1', data);
        return data
    } catch (err) {
        request1();
    }
};

const request2 = async (data) => {
    try {
        const data = await rp.get();
        console.log('data in request2', data);
        return data
    } catch (err) {
        request2();
    }

};

const getData = async() => {
    console.log('starting request 1');
    await request1();
    console.log('starting request 2');
    await request2()

};

getData();

И вот что происходит, когда вы возвращаетесь:

const rp = {
    get: async function() {
        await new Promise(r => setTimeout(r, 250));
        this.count++;
        if (this.count % 2 === 0) {
            return this.count;
        } else {
            throw new Error('error: even')
        }
    },
    count: 0
};

const request1 = async () => {
    try {
        const data = await rp.get();
        console.log('data in request1', data);
        return data
    } catch (err) {
        return request1();
    }
};

const request2 = async (data) => {
    try {
        const data = await rp.get();
        console.log('data in request2', data);
        return data
    } catch (err) {
        return request2();
    }

};

const getData = async() => {
    console.log('starting request 1');
    await request1();
    console.log('starting request 2');
    await request2()

};

getData();

В первом примере вы заметите, что request2 запускается до того, как request1 регистрирует свои данные, но во втором примере, с операторами return, request2 не запускается до тех пор, пока request1 получает данные.

0 голосов
/ 02 марта 2020

Вы можете создать глобальную функцию запроса, что-то вроде этого.

const globalRequest = async (link, options, retryCount=0) => {
    try {
        if(retryCount > 3) return "Some issue with the url";
        const data = await rp.get(link, options)
        return data;
    } catch (err) {
        logger.error(err)
        await globalRequest(link, options, retryCount+1);
    }
}


const getData = async() => {
    for(let req of requests){
       await globalRequest(req.link, req.options);
    }
})

getData()
...