0

以下に示すようなコードがあります。次のようなコードを使用して、(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");
            }
        });
};`
4

1 に答える 1

2

できません。取得は非同期です。getInstancesGET が完了する前に返されるためgetInstances、データを返すことはできません。(以下の注記を参照してください。)

(少なくとも) 3 つのオプションがあります。

  1. コールバックを使用する

  2. 後で入力される空のオブジェクトを返し、それを必要とするコードに定期的にポーリングさせます

  3. 同期取得を使用する (良い考えではありません)

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);
        }
    });
};

そして、次のように呼び出します。

myGraph.getInstances(component, function(data) {
    // Use the data here
});

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
};

そして、次のように呼び出します。

var obj = myGraph.getInstances(component);

// ...later...
if (obj.getData) {
    // We have the data, use it
}
else {
    // We still don't have the data
}

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;
};

そして、次のように呼び出します。

var getData = myGraph.getInstances(component);

繰り返しますが、私はそれを推奨していません。同期 ajax 呼び出しはブラウザーの UI をロックし、ユーザー エクスペリエンスの低下につながります。

于 2012-12-05T10:49:54.633 に答える