Je suis en train de créer une saga qui exécute plusieurs fetch
dans un parallèle, et il devrait aller jusqu'à ce que le premier fetch
résout, OU tous les rejets fetch
. Je ne pouvais pas comprendre cette fonctionnalité. J'expérimente avec race
mais ceci termine une course avec même le premier rejeter. Voici ma saga:Course jusqu'à la première résolution, ou tout rejeter (inverse de tous)
const pingOfflineSaga = function* pingOfflineSaga() {
while (true) {
yield take(PING_OFFLINE);
const OFFLINE_SERVERS = ['https://duckduckgo.com/', 'https://www.bing.com/', 'https://www.google.com/'];
const responses = yield race(OFFLINE_SERVERS.reduce((acc, server) => {
acc[server] = call(fetch200, server);
return acc;
}, {}));
const [ res ] = Object.values(responses);
if (res === true) {
yield put(update({ isOffline:undefined }));
break;
}
}
}
J'essaye de résoudre dès que j'obtiens la première réponse d'état de 200. fetch200
est ceci:
async function fetch200(url) {
let res;
try {
res = await fetch(url);
} catch(err) {
throw new Error(`fetch200 :: Fetch errored with message: ${err.message}`);
}
if (res.status === 200) {
return true;
} else {
throw new Error('fetch200 :: Fetch did not get 200 status');
}
}
L'inverse de all
effet.
Merci Fuzzy, je cherchais un moyen de le faire avec en utilisant seulement des effets Redux-saga. Dans le pire des cas, je peux lancer un 'throw' si je trouve le statut 200 dans' fetch200' et que j'utilise l'effet 'all'. Mais maintenant "lancer" n'est pas mauvais, c'est ce que je vais faire, "lancer d'abord". Mais je préfère ne pas parce que ce n'est pas le plus facile à raisonner, c'est comme logique inverse haha. – Noitidart