1

以下にこのコードがあり、ajax呼び出しのsuccess関数でデータを返したいと思います。もちろん、async:falseを実行して直接返すと、取得できますが、やりたくありません。

今のように実行すると、情報変数は未定義になります(async:falseを実行すると、情報が取得されるため、問題となるのはデータの内容ではありません)。

なぜそれが機能しないのか理解できません。コールバック関数をグーグルで検索しましたが、正しく実行しているようです...

function PUT_updateSystem(id) {
    var system= {};
    system= getSystemInformation(name, function(data){
                                var system = data;
                                return system;});

    var information = system.info;

}
// Returns system information
function getSystemInformation(name,callback){
    $.ajax({
        type:"GET",
        url: getUrl(),
        cache: false,
        dataType: "json",
        success: function(data){
            callback(data);
        }
    });
}

編集:私のコードを現在持っているものに変更しました

このデータを使用してjsTreeを生成し、そのツリーのjsonデータを作成するために上記を実行していますが、情報変数をオブジェクトに入れ、それを反復処理してノードを作成しています。問題はツリーにあるのではないので、ここには含めません。そのロジックを取り出してテストすることもできます。

だから何が起こっているのか、

  1. ページの読み込みを開始します
  2. 上記を実行します
  3. 情報はjavascriptオブジェクトに入れられます
  4. javascriptオブジェクトを繰り返し処理します。
  5. 「未定義のプロパティ'長さ'を読み取れません」というエラーが表示されます
  6. デバッグしていると、system.doneをスキップしていることがわかります。それが行われないかもしれないので、これは理にかなっています。

それが完了するのを待つ方法はありますか?

編集:より多くの情報を提供する

//ファイル内でloadinfo.js

// Returns system information promise
function getSystemInformation(){
    return $.ajax({
        type:"GET",
        url: getUrl(), // url is defined somewhere else
        cache: false,
        dataType: "json"
    });
}

// IN A FILE CALLED tree.js
// I have other variables from loadinfo.js that are here so they can communicate fine

    $.when(getSystemInformation(), $.Deferred(function(deferred) {
        $(deferred.resolve);
    })).done(function(data) {
        mapCache["system"] = data;
        console.log("defer DONE!!");

$.each(mapCache["system"], function(index, system) {
            var children = doDisplayChildNodes(system.name);
            ...
                    ...
});

この$.eachで行っているのは、mapCache ["system"]からデータを取得し、"jstree"ノードを作成することです。各システムに子ノードが関連付けられているため、同じことを行うために子関数を実行します。このロジックはすべて、ajax呼び出しを「async:false」として使用したときに正常に機能するため機能しました。そのため、これを投稿しません。

$.each中にundefinedのCannotreadプロパティ'length'を受け取りました。mapCacheに「ウォッチ」が設定されていて、すべてがロードされた後、mapCacheに正しい値が入力されるため、これは奇妙なことです。GoogleChromeのデバッグを使用しています。

4

4 に答える 4

5

コールバックを使用しましたが、非同期ではなく同期ロジックで使用しました。このようにしてみてください:

function PUT_updateSystem(id) {
    var system = getSystemInformation(name);
    system.done(function(data){
        var information = data.info;
        // do stuff with `information` here, not elsewhere.
    });
}
// Returns system information promise
function getSystemInformation(name){
    return $.ajax({
        type:"GET",
        url: getUrl(),
        cache: false,
        dataType: "json"
    });
}
于 2013-02-06T15:16:49.510 に答える
0
function PUT_updateSystem(id) {
    var system= {};
    system= getSystemInformation(name, callbackfunction);

    var information = system.info;

}
//callbackfuncion
function callbackfunction(data){
    var system = data;
    return system;
}
// Returns system information
function getSystemInformation(name,callback){
    $.ajax({
        type:"GET",
        url: getUrl(),
        cache: false,
        dataType: "json",
        success: function(data){
            window[callback](data);
        }
    });
}

関数名を変数として置くcallback(data);
代わりにwindow[callback](data);

于 2013-02-06T15:14:15.803 に答える
0

Asynchronyousは、PUT_updateSystemがすでに実行されているときにコールバックが呼び出されることを意味します。

getSystemInformationを呼び出すとサーバーに対して要求が行われますが、呼び出された直後に関数はvar information=system.info;を続行します。サーバーが応答する時間がある前に、system.info; まだ設定されていません。開発ツールIEを備えたブラウザ、Firebugプラグインを備えたFirefox、Chromeを使用している場合は、F12キーを押すだけです。そして、次のコードを実行すると、コンソールでメッセージを確認することのコールバックの意味を理解できます(JavaScriptの実行を一時停止するため、アラートは機能しません。

function PUT_updateSystem(id) {
    var system= {};
    system= getSystemInformation(name, function(data){
                                var system = data;
// you re declare system here so it' actually not set
// if you want to set system in PUT_updateSystem you should
// do system = data; without the val
console.log("this comes last");
console.log("data is returned now",data);
                                return system;});
console.log("This comes first");
    var information = system.info;

}
// Returns system information
function getSystemInformation(name,callback){
    $.ajax({
        type:"GET",
        url: getUrl(),
        cache: false,
        dataType: "json",
        success: function(data){
console.log("this comes second");
            callback(data);
        }
    });
}
于 2013-02-06T15:18:27.537 に答える
-2

あなたはそれを正しく行っていません、コールバックはデータを返しません。JavaScriptには待機ステートメントはありません。非同期呼び出しが実行され、JavaScriptが残りのコードを処理し続けます。

あなたのコードは

function PUT_updateSystem(id) {
    var system= {};

    function processData(data) {
        var information = data.info;
        alert("Do next step");
    }

    system = getSystemInformation(name, processData);
}

ロジックを2つのステップに分割します。

  1. Ajaxに電話をかける
  2. コールバックでデータを処理する
于 2013-02-06T15:11:05.873 に答える