Jquery 延迟AJAX下载脚本的执行,以便将值返回给调用它的函数

Jquery 延迟AJAX下载脚本的执行,以便将值返回给调用它的函数,jquery,Jquery,我不知道该怎么问这个问题,但我还是要问。请注意,这是基于我的场景的过度点画代码 如下所述,我在客户机上有一个JavaScript函数,它调用服务器来检索数据,可能是HTML或JS。我想在许多场景中重用被调用的函数,所以我不想硬编码服务器返回的内容类型。我遇到的问题是,当AJAX返回时,它已经对JS进行了评估,我不确定如何从JS中获得结果,以便将其附加到我希望的DOM中 我相信我不必解释,但事件链是: 用户点击按钮 单击routed to function dummy Function dummy

我不知道该怎么问这个问题,但我还是要问。请注意,这是基于我的场景的过度点画代码

如下所述,我在客户机上有一个JavaScript函数,它调用服务器来检索数据,可能是HTML或JS。我想在许多场景中重用被调用的函数,所以我不想硬编码服务器返回的内容类型。我遇到的问题是,当AJAX返回时,它已经对JS进行了评估,我不确定如何从JS中获得结果,以便将其附加到我希望的DOM中

我相信我不必解释,但事件链是:

  • 用户点击按钮
  • 单击routed to function dummy
  • Function dummy通过AJAX从服务器加载数据,这可能是 HTML或JS
  • 我希望将AJAX调用的结果路由回函数dummy,这样它就可以将数据附加到id为“canvas”的div中。我不想使用eval,我对调用和apply方法感到困惑,这些方法看起来可能有用,但我不知道。我不想在服务器上创建内容并发送它。我希望客户端处理UI元素

    我应该怎么做才能解决这个问题,还是有更好的方法来解决我需要的问题

    谢谢

    客户端JS/JQuery:

        $(document).ready(function() {
            $(".getcanvas").click(function(e){
                dummy("/someurl");
            });
        }
        function fetch(obj) {
            var defaults, settings, oD, oS, oX;
            if (!(obj.url === undefined)) {
                defaults = {type:"GET",timeout:4000,async:false,success:function(iD,iS,iX){oD=iD;oS=iS;oX=iX;}};
                settings = $.extend({}, defaults, obj); 
                $.ajax(settings);          
            } 
            return {"data":oD, "status":oS, "state":oX};        
        }
        function get(url) {
            var s = fetch({url: url});
            return s.data;
        }
        function dummy(url) {
            $("div#canvas").append(get(url));
        }
        function dothis(json) {
            var res = '';
            json = $.parseJSON(json);
    
            $.each(json.objects, function(index, object) {
                res += '<div id="+object.id+">'+object.message+'</div>';
            }
            return res;
        }
    
    $(文档).ready(函数(){
    $(“.getcanvas”)。单击(函数(e){
    虚拟(“/someurl”);
    });
    }
    函数获取(obj){
    变量默认值、设置、oD、oS、oX;
    如果(!(obj.url==未定义)){
    默认值={type:“GET”,超时:4000,异步:false,成功:函数(iD,iS,iX){oD=iD;oS=iS;oX=iX;};
    设置=$.extend({},默认值,obj);
    $.ajax(设置);
    } 
    返回{“数据”:oD,“状态”:oS,“状态”:oX};
    }
    函数get(url){
    var s=fetch({url:url});
    返回美国数据;
    }
    函数虚拟(url){
    $(“div#canvas”).append(get(url));
    }
    函数dothis(json){
    var-res='';
    json=$.parseJSON(json);
    $.each(json.objects,函数(索引,对象){
    res+=''+对象。消息+'';
    }
    返回res;
    }
    
    HTML:

    
    某物
    
    服务器@/someurl:

        <script>
        var o = '{objects:[{id:57,message:"testing"},{id:45,"somethingnew"}]}';
        dothis(o);
        </script>
    
    
    var o='{objects:[{id:57,消息:“testing”},{id:45,“somethingnew”}]}';
    dothis(o);
    
    为什么不直接从服务器返回不带
    标记的代码,然后再附加脚本标记呢

    编辑

    您可以像这样附加它:

    $("div#canvas").append("<script>" + get(url) + "</script>");
    
    $(“div#canvas”).append(“+get(url)+”);
    
    您不能使用回调吗?否则,这就有点违背了异步JavaScript和XML的观点。同步XHR是个坏主意。
    async:false
    不推荐使用(参见文档)而且很少有有效的用例使用它。可以使用成功回调或
    $。deffered
    来处理您的needs@minitech我使用回调函数将数据返回给调用者。对于另外两个,这仍然不能回答如何将被调用函数生成的数据返回给原始调用者的问题我想了很多,所以我会接受这个,但我需要一个虚拟函数来接受HTML或脚本。我不知道你为什么希望它是HTML,但是如果它对你的项目有意义,你可以将脚本包装成一个
    div
    标记而不是
    script
    标记,然后在客户端的
    script
    标记中重新包装它。
    $("div#canvas").append("<script>" + get(url) + "</script>");