Pregunta jquery .getscript () de devolución de llamada cuando el script está completamente cargado y ejecutado


A partir de la página jq apry http://api.jquery.com/jQuery.getScript/

Retrollamada de éxito

La devolución de llamada se activa una vez que la secuencia de comandos se ha cargado pero no necesariamente se ha ejecutado.

$.getScript("test.js", function() {
    foo();
});

Si el foo() función depende de test.js, no se puede ejecutar con éxito.

Vi algo similar con la API de google api, pero en ese caso puedes especificar la función de devolución de llamada en la URL de scripts ajax. Pero, en general, ¿hay una manera obvia de esperar hasta que se ejecute el script ajax para hacer la devolución de llamada?


32
2018-01-28 15:30


origen


Respuestas:


Sé que es una vieja pregunta, pero creo que las respuestas que contienen "hecho" no son explicadas por sus propietarios y, de hecho, son las mejores respuestas.

La respuesta más votada exige el uso de "async: falso", que a su vez creará una llamada de sincronización que no es óptima. por otro lado, las promesas y los handlers prometedores se introdujeron en jquery desde la versión 1.5 (¿quizás antes?) en este caso estamos intentando cargar un script de forma asíncrona y esperar a que termine de ejecutarse.

La devolución de llamada por definición documentación getScript

La devolución de llamada se activa una vez que la secuencia de comandos se ha cargado pero no necesariamente se ha ejecutado.

lo que debes buscar es cómo actúan las promesas. En este caso, como está buscando una secuencia de comandos para cargar de forma asincrónica, puede usar "luego" o "hecho" Mira esto este hilo lo cual explica la diferencia muy bien.

Básicamente se llamará solo cuando se resuelva una promesa. en nuestro caso, cuando el script se cargó con éxito y terminó de ejecutarse. Así que básicamente en tu código significaría:

$.getScript("test.js", function() {
    foo();
});

debe cambiarse a:

$.getScript("test.js").done(function(script, textStatus) {
    console.log("finished loading and running test.js. with a status of" + textStatus);
});

6
2017-09-16 08:15



Puedes usar ajax

jQuery.ajax({
        async:false,
        type:'GET',
        url:script,
        data:null,
        success:callback,
        dataType:'script'
    });

Async es falso, porque quieres cargar y ejecutar el script, luego de eso en la devolución de llamada exitosa puedes llamar a tu función foo ()


3
2018-01-28 15:37



$.getScript( "ajaxFile/myjs.js" )
.done(function( s, Status ) {
    console.warn( Status );
})
.fail(function( jqxhr, settings, exception ) {
    console.warn( "Something went wrong"+exception );
});

2
2017-07-06 09:59



$.getScript(...) + setInterval(...) trabajó para mi:

$.getScript('https://www.google.com/recaptcha/api.js')
    .done(function () {
        var setIntervalID = setInterval(function () {
            if (window.grecaptcha) {
                clearInterval(setIntervalID);
                console.log(window.grecaptcha);
            };
        }, 300);
    })

Una vez el variable lo que estamos buscando está definido (en mi caso window.grecaptcha, puedo llamar a un closure function que puede ser abstracted out.

Buena suerte...


2
2017-11-22 03:32



Me temo que la solución requiere sondeo para la dependencia. Alternativamente, el script debe estar envuelto en una devolución de llamada predefinida como AMD.


0
2017-07-13 13:32



Estaba enfrentando el mismo problema hoy y se me ocurrió una solución basada en promesas y un temporizador de intervalo:

$.getScript("test.js", function() {
    var $def = $.Deferred();
    if (typeof foo === 'undefined') { // "foo" isn't available
        var attempts = 0;
        // create an interval
        // that will check each 100ms if the "foo" function
        // was loaded
        var interval = setInterval(function() {
            if (typeof foo !== 'undefined') { // loaded
                window.clearInterval(interval);
                $def.resolve();
            }
            // after X unsuccessfull attempts, abort the operation
            else if (attempts >= 100) {
                window.clearInterval(interval);
                $def.reject('Something went wrong');
            }

            attempts++;
        }, 100);
    }
    else { // "foo" is available
        $def.resolve();
    }
    return $def.promise();
}).then(function() {
    // at this point "foo()" is definitely available.
}).fail(function() {
    // deal with the failure
});

La idea es que cargue un guión dado que exponga alguna variable (el foo función en su ejemplo de pregunta) que todavía no existe, por lo tanto, después de que el script se cargue por getScript usted verifica si existe esta variable, si no, crea un intervalo que verificará continuamente si la variable está disponible, y solo cuando se cumpla esta condición usted resolverá la promesa.


0
2017-08-18 17:32



$ getScript usa así

$.getScript( "js/jquery.raty.min.js" )
    .done(function( script, textStatus ) {
          console.log( textStatus );
         }
          });

esto está funcionando bien para mí


-1
2018-04-08 07:42