2017-10-13 6 views
1

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.

Répondre

1

Vous pouvez utiliser la méthode de Bluebird Promise.any

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 promises = OFFLINE_SERVERS.map(server => fetch(server));    
     result = yield call(Promise.any, promises); 

     if (result) { 
      yield put(update({ isOffline:undefined })); 
      break; 
     } 
    } 
} 
+0

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