Middle+
27
/** * 'asyncAuth(callback)' функциясы callback-ты қабылдайды, оған * қате (бірінші аргумент ретінде) және * серверден алынған деректер (екінші аргумент ретінде) берілуі мүмкін. * asyncAuth((қате, деректер) => {}); * * Сіз 'auth()' функциясын жүзеге асыруыңыз керек, * ол 'asyncAuth()'-ты шақырады, бірақ Promise-ті қайтарады. * * @returns {Promise} */ function auth() { return new Promise((resolve, reject) => { asyncAuth((қате, деректер) => { if (қате) { reject(қате) } else { resolve(деректер) } }); }) } /** * 'tryAuth()' функциясы 'auth()'-ты пайдаланады және қате болған жағдайда, * N қосымша әрекет жасайды. * Барлық әрекеттер сәтсіз болса - соңғы қатені қайтарады * * @returns {Promise} */ function tryAuth(n) { return new Promise((resolve, reject) => { function attempt(attemptsLeft) { auth().catch((қате) => { if (n <= 0) { // Әрекеттер аяқталды — соңғы қатені қайтарамыз return Promise.reject(қате); } // Әлі де әрекеттер бар — рекурсивті түрде n - 1-ге шақырамыз return tryAuth(n - 1); }); } }) }
Сұралған компаниялар
Яндекс
AI-дан жауап
sobes.tech AI
Сіздің tryAuth функцияңыз толық орындалмаған және қателер бар. Міне, түзетілген нұсқа, ол рекурсивті түрде auth() функциясын N ретке дейін орындауға тырысады және нәтижені немесе соңғы қателікті қайтарады:
function tryAuth(n) {
return auth().catch(error => {
if (n <= 0) {
return Promise.reject(error);
}
return tryAuth(n - 1);
});
}
Түсіндірме:
- Алдымен, auth() шақырылады, ол Promise қайтарады.
- Егер auth() сәтті болса, Promise нәтижемен шешіледі.
- Егер қате болса, қалған әрекеттер бар-жоғын тексереміз (n > 0).
- Егер әрекеттер қалса, tryAuth функциясын азайтылған әрекет санымен қайта шақырамыз.
- Егер әрекеттер қалмаса, соңғы қателікті жібереміз.
Бұл тәсіл бірнеше рет авторизацияны қайталап орындауға мүмкіндік береді, ол сәттілікке жеткенше немесе әрекеттер саны таусылғанша.