¿Cómo devolver el retorno de una promesa de callback con fetch?

Estoy un poco perplejo. He olvidado cómo hacer esto. Tengo una función llamada ext.get () que toma un parámetro de url. Obtiene una respuesta de la url. La función ext.get () está destinada a devolver la respuesta como un json. No creo que esté haciendo eso.

ext.get = (url) => { let myHeaders = new Headers(); let options = { method: 'GET', headers: myHeaders, mode: 'cors' }; //fetch get fetch(url, options).then(response => { console.log(JSON.stringify(response.json())) return JSON.stringify(response.json()) }); }; 

Si necesita la respuesta como JSON y considera response.json() la misma manera que response.text().then(txt => JSON.parse(txt))

  return fetch(url, options).then(response => response.text()); 

Por lo tanto, la función en su totalidad sería

 ext.get = (url) => { let myHeaders = new Headers(); let options = { method: 'GET', headers: myHeaders, mode: 'cors' }; return fetch(url, options).then(response => response.text()); }; 

De esa manera no estás haciendo JSON.stringify(JSON.parse(json)) … lo cual es simplemente json

Sin embargo, sospecho que quieres un objeto de JavaScript simple

 ext.get = (url) => { let myHeaders = new Headers(); let options = { method: 'GET', headers: myHeaders, mode: 'cors' }; return fetch(url, options).then(response => response.json()); }; 

Entonces usarías esto como:

 ext.get('url').then(result => { // result is the parsed JSON - ie a plan ol' javascript object }); 

Está utilizando fetch , que es una API asíncrona. Esto significa que su función también debe ser asíncrona, es decir, debe devolver una Promise . (Podría hacer esto con una callback, pero esto es 2017 …)

No puede devolver JSON desde la función porque la función regresará antes de que la respuesta del servidor esté disponible. Debe devolver una Promesa y tratar con ella utilizando then (o await ) en su código de llamada.

La forma más simple y mejor de hacer esto aquí es simplemente devolver el resultado de la llamada de fetch una vez que se haya transformado. No desea analizar JSON sino devolverlo como una cadena. Esto requiere la llamada response.text() :

 ext.get = (url) => { let myHeaders = new Headers(); let options = { method: 'GET', headers: myHeaders, mode: 'cors' }; //fetch get return fetch(url, options).then(response => response.text()); }; 

Y su código de llamada:

 ext.get('http://example.com').then((response) => { console.log(response); // or whatever }); 

o con await :

 let response = await ext.get("http://example.com");