¿Cómo hacer que javascript obtenga sincronía?

4 minutos de lectura

Avatar de usuario de Nabeel Khan
nabeel khan

Estoy usando fetch para obtener datos json de una API. Funciona bien, pero tengo que usarlo repetidamente para varias llamadas, por lo tanto, debe ser sincrónico o, de lo contrario, necesito alguna forma de actualizar la interfaz cuando se completa la búsqueda para cada componente.

function fetchOHLC(yUrl){
    fetch(yUrl)
    .then(response => response.json())
    .then(function(response) {
                alert(JSON.stringify(response.query));

            var t = response.created;
            var o = response.open;
            var h = response.high;
            var l = response.low;
            var c = response.close;
        
        return {t,o,h,l,c};
    
    })
    .catch(function(error) {
        console.log(error);
    });    
}

var fetchData = fetchOHLC(yUrl);
alert(fetchData); // empty ?

¿Hay alguna otra forma de lograrlo que no sea usando fetch? (No quiero usar jquery preferiblemente).

Gracias

Editar

La pregunta es sobre fetch-api, no ajax, no jquery, así que deje de marcarlo como duplicado de esas preguntas sin leerlo correctamente.

  • Votó para reabrir, ya que las solicitudes síncronas tienen casos de uso válidos. (P.ej chrome.webRequest.onBeforeRequest.addListener no le permitirá realizar operaciones asincrónicas, dejándole sin opción).

    – Константин Ван

    21 de enero a las 2:54

Avatar de usuario de RiZKiT
RiZKiT

fetch está destinado a realizar llamadas asincrónicas solamente, pero hay algunas opciones:

Opción 1

Si XMLHttpSolicitud también está bien, entonces puedes usar asíncrono: falsoque hará una llamada síncrona.

opcion 2

Usar async/await que es asincrónico bajo el capó, pero parece que es sincrónico, consulte https://stackoverflow.com/a/54950884/2590616

Opción 3

o bien, necesito alguna forma de actualizar la interfaz cuando se complete la búsqueda para cada componente

Esto suena como fetch + Promise.all() sería una buena opción, consulte https://stackoverflow.com/a/52013616/2590616

Avatar de usuario de Matthew Robin
matthew petirrojo

Si no desea utilizar la API de búsqueda, deberá utilizar devoluciones de llamada, detectores de eventos, XMLHttpRequest.

  • Como está escrito actualmente, su respuesta no está clara. Edite para agregar detalles adicionales que ayudarán a otros a comprender cómo esto aborda la pregunta formulada. Puede encontrar más información sobre cómo escribir buenas respuestas en el centro de ayuda.

    – Comunidad
    Bot

    9 de junio a las 3:37

Avatar de usuario de Jonas Wilms
jonas wilms

Si vino aquí porque dejó caer “cómo hacer que javascript obtenga sincronía” en un motor de búsqueda:

Eso no tiene mucho sentido. Realizar operaciones de red no es algo que requiera el trabajo de la CPU, por lo que lo bloquea durante un fetch(...) tiene poco sentido. En su lugar, trabaje correctamente con asincronía como se muestra en el duplicado vinculado anteriormente.


En caso de que realmente necesite una solicitud síncrona (no la necesita), use el obsoleto XMLHttpRequest variante síncrona, para citar a MDN:

Nota: A partir de Gecko 30.0 (Firefox 30.0/Thunderbird 30.0/SeaMonkey 2.27), Blink 39.0 y Edge 13, las solicitudes sincrónicas en el subproceso principal han quedado obsoletas debido a su impacto negativo en la experiencia del usuario.

const request = new XMLHttpRequest();
request.open('GET', '/bar/foo.txt', false);  // `false` makes the request synchronous
request.send(null);

Puede encontrar más información en MDN.

  • Esto proporciona un buen consejo de que la pregunta puede estar equivocada, pero no responde la pregunta.

    – 5fec

    5 de enero de 2021 a las 2:22

  • No soy un experto, pero ¿qué pasa con los valores (iniciales) que son absolutamente necesarios de la API sin los cuales el resto del javascript no tiene ningún sentido?

    – johannes_lalala

    21 de febrero de 2021 a las 13:23

  • Sé que estoy comentando una pregunta de hace cuatro años, pero en algunos casos raros, hacer una solicitud web síncrona tiene sentido y es legítimo en mi opinión. Por ejemplo, estoy realizando una solicitud web síncrona para descargar la configuración de OAuth requerida por mi API (client_id y autoridad) almacenada en un archivo estático (por ejemplo, settings.json). El archivo también se puede almacenar en caché en gran medida mediante el control de caché. MDN Web Docs explica cómo hacerlo: desarrollador.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/…

    –Roberto Prevato

    3 abr 2021 a las 18:01

  • Sí, esta es una respuesta terrible, es una pena que la comunidad de desbordamiento de pila esté llena de tanta gente que piensa como tú. La pregunta es “cómo hacer una solicitud de recuperación síncrona en javascript” que su respuesta no responde, en su lugar, eligió responder con condescendencia sobre cómo se podría hacer una recuperación normal.

    – Mateo Ludwig

    4 mayo 2021 a las 18:37

  • @JonasWilms XMLHttpRequest puede estar en desuso, pero todavía hay algunas API de navegador estrictamente síncronas en su navegador. Este Dia. Al igual que WebRequest, la única forma válida de proteger un navegador (interceptar SSL no es válido). Y si no desea reinventar la rueda usando JavaScript cada vez (también conocido como inflar el navegador), necesita solicitudes web estrictamente sincrónicas en ese nivel. Async, await, Promises u otras devoluciones de llamada no se pueden usar aquí. En todos los navegadores actuales. (Chrome intenta dejar de admitir WebRequest con Manifest v3. Parece que Mozilla es un poco más inteligente en ese sentido…)

    – Tino

    5 de julio de 2021 a las 18:08


¿Ha sido útil esta solución?