以下にこのコードがあり、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データを作成するために上記を実行していますが、情報変数をオブジェクトに入れ、それを反復処理してノードを作成しています。問題はツリーにあるのではないので、ここには含めません。そのロジックを取り出してテストすることもできます。
だから何が起こっているのか、
- ページの読み込みを開始します
- 上記を実行します
- 情報はjavascriptオブジェクトに入れられます
- javascriptオブジェクトを繰り返し処理します。
- 「未定義のプロパティ'長さ'を読み取れません」というエラーが表示されます
- デバッグしていると、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のデバッグを使用しています。