jQuery延迟并通过getScript承诺

问题描述

| 我一直在研究jQuery中新的(ish)延迟对象,却在这里偶然发现了该网站文章。 本文中有一些旨在缓存脚本的代码,因此不会多次请求脚本。
    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 );
在我看来,这是一种确保您的脚本仅在ѭ1成功后才会执行的方法。 就我的实验而言,即使我提供了错误的URL,也不会调用错误回调。 我是否错过了一些明显的事情,或者代码示例错误? 注意:我曾在网站上问过这个问题,但评论系统无法正常工作。 :-S     

解决方法

我相当确定该脚本无法处理跨域请求。
$.getScript
以不同的方式处理本地和跨域请求。对于本地请求,它将通过AJAX加载内容,然后运行它。由于这是正常的AJAX操作,因此会以正常方式发生错误。就我所能测试的而言,该代码可以正常工作。 但是,对于跨域请求,它可以通过在文档中插入“ 3”标记来起作用。不会为插入的
script
元素触发
error
处理函数,因此您的
error
回调将不会触发。     ,但是...您可以将远程URL检查委托给一个(例如)php文件。
            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,errorThrown);
                    },success:    function (data,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);
并非100%可靠,但总比没有好...