0

estoy usando el siguiente Fetch:

var bdresultados;
if(respuesta.context.bueno){

      fetch('/bd/').then(response =>{

        return response.json();
        }).then(data => {
          for(let indice of data){
        bdresultados = indice.Personas;
          }
        }).catch(err => {
      });   
      console.log(bdresultados);
    }

El problema es que necesito usar esa variable var bdresultados fuera del fetch. ¿Cómo podría hacerlo? Gracias

Isaac Alejandro
  • 329
  • 2
  • 4
  • 14
  • fijate en los relacionados: https://es.stackoverflow.com/q/33612/81450, si es algo diferente habría que ver que tipo de uso le queres dar, pues no tendrá contenido (esperado) hasta que no se rellena con el `.then()` del `fetch()` – alo Malbarez Dec 19 '18 at 01:00
  • chequea [esta respuesta podria ser util](https://es.stackoverflow.com/questions/169297/reutilizar-ajax) – JackNavaRow Dec 19 '18 at 01:56

2 Answers2

0

Declararla fuera del fetch y en then la reaaccionas.

var bdresultados;
fetch('/bd/').then(response =>{
        return response.json();
        }).then(data => {
          for(let indice of data){
           bdresultados = indice.Personas;
          }
        }).catch(err => {
      });
    }

De esta forma podrás llamarla desde fuera. Toma eso solo como ejemplo porque tu debes de asignarlo en el nivel adecuado de la función.

farsSharp
  • 2,366
  • 11
  • 20
  • Hola, ya lo hice así, incluso hice las modificaciones como puedes ver en mi codigo, pero sigo sin poder ver el resultado – Isaac Alejandro Dec 19 '18 at 00:52
  • Entonces no es problema del manejo de variables, es por los resultados de tu fetch. Al momento de compilar¿El resultado llega al then?Si es así¿ TIene el formato correcto como para hacer la conversion a json? SI no, ¿que mensaje de erro hay en el catch? – farsSharp Dec 19 '18 at 00:56
0

Tu problema es que intentas acceder justo después del fetch, es decir

var bdresultados

fetch(...)
.then(...)

// bdresultados probablemente todavía no se haya inicializado
// esto se ejecutará inmediatamente sin esperar al fetch
console.log(bdresultados) // undefined

No puedes hacer eso. fetch es una operación asíncrona, el console.log se ejecutará inmediatamente después, sin que el then todavía se haya ejecutado y por tanto a bdresultados todavía no se habrá asignado nada.

Necesitas esperar a que la promesa del fetch se complete (se ejecute el then()). Tienes algunas alternativas. Lo más recomendable es que proceses la info dentro del then o que este llame a alguna función que continue el tratamiento, no puedes simplemente bloquear el código. Puedes hacer algo así:

function miFuncionParaTratarLaRespuesta(bdresultados) {
   console.log(bdresultados);
}
var bdresultados // NOTA: ya no necesitas esta variable en realidad
if(respuesta.context.bueno){
    fetch('/bd/')
    .then(response => response.json())
    .then(data => {
        for(let indice of data){
            bdresultados = indice.Personas;
        }
        miFuncionParaTratarLaRespuesta(bdresultados)
    })
    .catch(err => {});   
}

Si todo tu contexto está bajo async (que lo dudo), la forma más simple es establecer un await delante del fetch para volverlo síncrono (el console.log del ejemplo no se ejecutará hasta que el fetch termine). EDITO: borro el ejemplo de async/await para no liar, dado que requiere más elaboración y es más complejo de lo que necesitas.

NOTA

Creo que el for que tienes es un tanto inútil, sólo estás quedándote con el último valor iterado, pero eso es otro problema.