Javascript 代码内部变量的问题

Javascript 代码内部变量的问题,javascript,jquery,Javascript,Jquery,我有一个如下所述的代码,请问如何使用以下代码获取(getData)的值: var instanceArray = myGraph.getInstances(component) 我想myGraph.getInstances(component.getData可以,但失败了 this.getInstances = function(component) { var getData = {}; $.ajax({ url: "/rpc/alerts2/

我有一个如下所述的代码,请问如何使用以下代码获取(getData)的值:

var instanceArray = myGraph.getInstances(component)
我想
myGraph.getInstances(component.getData
可以,但失败了

this.getInstances = function(component) {
    var getData = {};
        $.ajax({
            url: "/rpc/alerts2/commonObj_rpc.cfc?method=getInstances",
            data: {"component":component},
            type: "POST",
            async: true,
            success: function(data) {
                getData = $.parseJSON(data);
                console.log("hey");
                var $render_component_instance = $("#instances").empty();
                $("#instances").append($("<option />").val("all").text("All Instances (Summed)"));
                $.each(getData, function (cIndex, cItem){
                    var $instance = $("<option />").val(cItem.si_instance).text(cItem.si_label.toUpperCase());
                    $render_component_instance.append($instance);
                })
                $("#instances").multiselect("refresh");
            }
        });
};`
this.getInstances=函数(组件){
var getData={};
$.ajax({
url:“/rpc/alerts2/commonObj_rpc.cfc?method=getInstances”,
数据:{“组件”:组件},
类型:“POST”,
async:true,
成功:功能(数据){
getData=$.parseJSON(数据);
console.log(“嘿”);
var$render_component_instance=$(“#instances”).empty();
$(“#实例”).append($(“”).val(“全部”).text(“所有实例(求和)”);
$.each(获取数据、函数(cIndex、cItem){
var$instance=$(“”).val(cItem.si_实例).text(cItem.si_label.toUpperCase());
$render\u component\u instance.append($instance);
})
$(“#实例”).multiselect(“刷新”);
}
});
};`

您不能,get是异步的
getInstances
在GET完成之前返回,因此
getInstances
不可能返回数据。(详见下文注释。)

您(至少)有三种选择:

  • 使用回调

  • 返回一个稍后将填充的空白对象,并让需要它的代码定期轮询它

  • 使用同步get(不是一个好主意)

  • 1.使用回调 您可以改为接受回调,然后在数据到达时调用它:

    this.getInstances = function(component, callback) {
    
        $.ajax({
            url: "/rpc/alerts2/commonObj_rpc.cfc?method=getInstances",
            data: {"component":component},
            type: "POST",
            async: true,
            success: function(data) {
                var getData = $.parseJSON(data);
                console.log("hey");
                var $render_component_instance = $("#instances").empty();
                $("#instances").append($("<option />").val("all").text("All Instances (Summed)"));
                $.each(getData, function (cIndex, cItem){
                    var $instance = $("<option />").val(cItem.si_instance).text(cItem.si_label.toUpperCase());
                    $render_component_instance.append($instance);
                })
                $("#instances").multiselect("refresh");
                callback(getData);
            }
        });
    };
    
    2.返回稍后将填充的空白对象 或者,您可以返回一个对象,该对象一开始为空,但稍后将作为属性向其添加数据。从你下面的评论来看,这可能与你想要的最接近。基本上,无法从函数外部访问函数的局部变量,但可以返回一个对象,然后在以后向其添加属性

    this.getInstances = function(component) {
    
        var obj = {};
    
        $.ajax({
            url: "/rpc/alerts2/commonObj_rpc.cfc?method=getInstances",
            data: {"component":component},
            type: "POST",
            async: false,    // <==== Note the change
            success: function(data) {
                var getData = $.parseJSON(data);
                console.log("hey");
                var $render_component_instance = $("#instances").empty();
                $("#instances").append($("<option />").val("all").text("All Instances (Summed)"));
                $.each(getData, function (cIndex, cItem){
                    var $instance = $("<option />").val(cItem.si_instance).text(cItem.si_label.toUpperCase());
                    $render_component_instance.append($instance);
                })
                $("#instances").multiselect("refresh");
    
                // Make the data available on the object
                obj.getData = getData;
            }
        });
    
        return obj; // Will be empty when we return it
    };
    
    3.使用同步get 我不建议这样做,但您可以使呼叫同步。请注意,同步ajax请求将在未来版本的jQuery中消失。但为了完整起见:

    this.getInstances = function(component) {
    
        var getData;    
        $.ajax({
            url: "/rpc/alerts2/commonObj_rpc.cfc?method=getInstances",
            data: {"component":component},
            type: "POST",
            async: false,    // <==== Note the change
            success: function(data) {
                var getData = $.parseJSON(data);
                console.log("hey");
                var $render_component_instance = $("#instances").empty();
                $("#instances").append($("<option />").val("all").text("All Instances (Summed)"));
                $.each(getData, function (cIndex, cItem){
                    var $instance = $("<option />").val(cItem.si_instance).text(cItem.si_label.toUpperCase());
                    $render_component_instance.append($instance);
                })
                $("#instances").multiselect("refresh");
            }
        });
    
        return getData;
    };
    

    但是,我不主张这样做。同步ajax调用会锁定浏览器的UI,导致糟糕的用户体验。

    您使用的是什么框架?什么是myGraph?myGraph只是一个瞬间的复制品。你能解释这个调用吗please@deetu:很乐意,但具体是什么…?我知道我可以使用synchronous轻松获取数据,但我只是尝试检索getdata,因此实例不需要在之后运行这些行it@deetu:对不起,我不懂那句话。“…所以实例不需要在它后面运行行…”是什么意思?我只需要getData中的数据,仅此而已
    var obj = myGraph.getInstances(component);
    
    // ...later...
    if (obj.getData) {
        // We have the data, use it
    }
    else {
        // We still don't have the data
    }
    
    this.getInstances = function(component) {
    
        var getData;    
        $.ajax({
            url: "/rpc/alerts2/commonObj_rpc.cfc?method=getInstances",
            data: {"component":component},
            type: "POST",
            async: false,    // <==== Note the change
            success: function(data) {
                var getData = $.parseJSON(data);
                console.log("hey");
                var $render_component_instance = $("#instances").empty();
                $("#instances").append($("<option />").val("all").text("All Instances (Summed)"));
                $.each(getData, function (cIndex, cItem){
                    var $instance = $("<option />").val(cItem.si_instance).text(cItem.si_label.toUpperCase());
                    $render_component_instance.append($instance);
                })
                $("#instances").multiselect("refresh");
            }
        });
    
        return getData;
    };
    
    var getData = myGraph.getInstances(component);