es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

“La función fetch de JavaScript se encuentra retrasada.”

Tengo un servidor Express esperando a que mi sitio web haga algo. Cuando mi sitio hace algo, se debe llamar a un script de shell en el servidor Express. El problema es: el script de shell solo se ejecuta después de que se haya aceptado o denegado la “ventana de confirmación”. Quiero que la recuperación ocurra lo antes posible. Ni siquiera necesitaría obtener nada del servidor Express, solo quiero indicarle a Express que ejecute el script de shell lo antes posible.

Tengo este código en el sitio web:

messaging.onMessage(function (payload){

    fetch("http://localhost:9000/testAPI")
        .then(res => res.text())
        .then(res => console.log("something:" + res));


    var r = confirm(callingname + " is calling.");
    if (r == true) {
        window.open(payload.data.contact_link, "_self");
    } else {
        console.log("didn't open");
    }
});

Tengo este código en el backend:

var express = require("express");
var router = express.Router();

router.get("/", function(req,res,next){
    const { exec } = require('child_process');
    exec('bash hi.sh',
        (error, stdout, stderr) => {
            console.log(stdout);
            console.log(stderr);
            if (error !== null) {
                console.log(`exec error: ${error}`);
            }
        });
    res.send("API is working");
});

module.exports = router;
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema, puedes modificar el código del lado del cliente para realizar una llamada asíncrona al punto de conexión de la API sin esperar una respuesta. En lugar de usar el método fetch, puedes utilizar el objeto XMLHttpRequest, que te permite realizar una llamada asíncrona sin esperar una respuesta. Aquí tienes un ejemplo de cómo puedes modificar el código del lado del cliente:

    messaging.onMessage(function (payload){
        var xhttp = new XMLHttpRequest();
        xhttp.open("GET", "http://localhost:9000/testAPI", true);
        xhttp.send();
    
        var r = confirm(callingname + " está llamando.");
        if (r == true) {
            window.open(payload.data.contact_link, "_self");
        } else {
            console.log("no se abrió");
        }
    });
    

    Esta modificación realizará una llamada asíncrona al punto de conexión de la API sin esperar una respuesta. El punto de conexión de la API ejecutará el script de shell tan pronto como se reciba la solicitud, sin esperar una respuesta.

Comments are closed.