2015-12-06 12 views
5

Sono un po 'confuso con come utilizzare correttamente il recupero. Sembra risolversi anche quando ricevo uno stato di errore. Il seguente codice è corretto (avvolgere il recupero in un'altra promessa)?Rifiuta promessa quando si utilizza fetch

function a(url, config) { 
 
    if (!config) 
 
    config = {}; 
 

 
    config = Object.assign(config, { 
 
    headers: { 
 
     'content-type': 'application/json;charset=utf-8' 
 
    } 
 
    }) 
 
    return new Promise(
 
    function(resolve, reject) { 
 
     fetch(url, config).then(
 
     function(res) { 
 
      if (res.status == 200 && res.ok) { 
 
      console.log("Promise resolved") 
 
      resolve(res); 
 
      return; 
 
      } 
 
      console.log("Promise rejected") 
 
      reject(res); 
 
     }, 
 
     function(rej) { 
 
      console.log("promise rejected") 
 
      reject(rej); 
 
     } 
 
    ) 
 
    } 
 
) 
 
} 
 

 
function b() { 
 
    a('/test').then(
 
    function(res) { 
 
     console.log('success'); 
 
     console.log(res) 
 
    }, 
 
    function(rej) { 
 
     console.log('Rejected'); 
 
     console.log(rej) 
 
    } 
 
) 
 
} 
 

 
b();
(Il codice di cui sopra dovrebbe funzionare bene in cromo via console ... basta copiare/incollare)

+1

se 'fetch' è l'operazione di recupero che esiste in tutti i browser moderni, è, come si sa chiaramente, i rendimenti una promessa. Quindi non c'è bisogno di avvolgerlo in una promessa, confonde solo le cose –

+0

In realtà ... si risolve anche con lo stato di errore come 400. Quindi, se voglio che il chiamato sappia ha un codice di errore ... Ho bisogno di avvolgere e rifiutare se non è ok/200. Anche se ... al momento ... il codice sopra riportato funziona come previsto (b funziona rifiutato) ... Sto guardando il mio codice per provare a riscrivere quanto sopra per abbinarlo. In entrambi i casi, il precedente era solo un esempio e fetch era proprio quello che potevo usare per creare una promessa facile da dimostrare. – Goblinlord

+1

Sembra buono, con questo codice si ottiene "Promesso respinto", "Rifiutato". Come previsto. Non è chiaro quale sia il problema. – dfsq

risposta

2

Se si desidera rifiutare dal successo di callback è necessario farlo in modo esplicito sia il ritorno promessa respinta, ad es return Promise.reject('error occurred'); o lanciando.

Inoltre, non si deve abusare Promise costruttore nel vostro caso, in quanto restituisce fetch già oggetto promessa:

function a(url, config) { 
    if (!config) 
     config = {}; 

    config = Object.assign(config, { 
     headers: { 
      'content-type': 'application/json;charset=utf-8' 
     } 
    }); 

    return fetch(url, config).then(
     function(res) { 
      if (res.status == 200 && res.ok) { 
       console.log("Promise resolved") 
       return res.json(); 
      } 
      console.log("Promise rejected"); 
      throw 'promise rejected'; 
     }, 
     function(rej) { 
      console.log("promise rejected"); 
      throw 'promise rejected'; 
     } 
    ); 
} 
+0

Non riesco a eliminare la domanda in quanto il codice funziona effettivamente come previsto = /. Grazie per i suggerimenti per i lanci invece di quello che stavo facendo. – Goblinlord

Problemi correlati