2011-05-26 22 views
8

He estado investigando el nuevo objeto (ish) diferido en jQuery y tropecé con este artículo del sitio web here.jquery diferir y promesas con getScript

En el artículo hay un código diseñado para almacenar en caché las secuencias de comandos para que no se soliciten más de una vez.

var cachedScriptPromises = {}; 

    $.cachedGetScript = function(url, callback) { 
     if (!cachedScriptPromises[ url ]) { 
      cachedScriptPromises[ url ] = $.Deferred(function(defer) { 
       $.getScript(url).then(defer.resolve, defer.reject); 
      }).promise(); 
     } 
     return cachedScriptPromises[ url ].done(callback); 
    }; 

// You would then call it like thus. 
$.cachedGetScript(url).then(successCallback, errorCallback); 

Lo que esto se parecía a mí fue una manera de asegurar que la secuencia de comandos sólo va a ejecutar si su $.getScript() fue exitosa.

Por lo que mis experimentos han pasado, la devolución de llamada de error nunca se llama, incluso si proporciono una url incorrecta.

¿He olvidado algo obvio o el código de la muestra es incorrecto?

Nota: Habría hecho esta pregunta en el sitio, pero el sistema de comentarios no funcionó. : -S

Respuesta

4

Estoy bastante seguro de que esa secuencia de comandos no puede funcionar en solicitudes entre dominios.

$.getScript funciona de diferentes maneras para solicitudes locales y entre dominios. Para solicitudes locales, carga el contenido a través de AJAX y luego lo ejecuta. Como esta es una operación AJAX normal, los errores ocurren de la manera normal. Ese código funciona bien, hasta donde puedo probarlo.

Para solicitudes de dominio cruzado, sin embargo, funciona insertando etiquetas script en el documento. Los controladores error nunca se activan para los elementos script que están insertados, por lo que sus devoluciones de llamada error nunca se activarán.

+0

Esa es una lástima. Gracias por la visión. –

+0

que bien podría depender de si '.getScript' permite ambos etiquetas script [CORS] (http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing) y de inyección. Incluso este último podría ser capaz de soportar diferidos, pero si lo hace o no, no sé. – hippietrail

+0

@lonesomeday, ¿está seguro de que para la solicitud local se ejecutará a través de ajax? si es así, ¿por qué cuando se llama a $ .ajax para un script local, solo devuelve los datos pero no los ejecuta? – adardesign

0

Pero ... puede delegar la verificación de URL remota a un archivo php (por ejemplo).

  checkremotefile: function(remotefile, options) { 
       options = $.extend(options || {}, { 
        dataType: 'html', 
        cache:  false, 
        url:  'ajax/checkfile.php?url=' + escape(remotefile), 
        error:  function (jqXHR,textStatus,errorThrown) { 
            $(this).coresystem('errorlog',jqXHR,textStatus,errorThrown); 
        }, 
        success: function (data,textStatus,jqXHR) { 
            if (data!='200') { 

            // ....call errorhandler 

            } 
        } 
       }); 
       return jQuery.ajax(options); 
      }, 

checkfile.php:

<?php 
if (!isset($_REQUEST['url'])) die('param url missing!'); 
if (!preg_match('/.*\.js$/',$_REQUEST['url'])) die('filetype not allowed'); 
$ch = curl_init($_REQUEST['url']); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_exec($ch); 
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
// $code 404 not found, $code = 200 found. 
curl_close($ch); 
echo($code); 

No es 100% fiable, pero mejor que nada ...

Cuestiones relacionadas