私はdojoを初めて使用しますが、DeferredAPIの処理で特定のエラーが発生します。
私の呼び出しコードは
function openEditor(id, fieldName) {
editOptionsDialog_fetchData(id, fieldName).then(function(data){
console.log("done!");
});
console.log("leaving openEditor!");
}
この関数を呼び出す
function editOptionsDialog_fetchData(id, fieldName) {
require(["dojo/ready", "dojo/data/ObjectStore", "dojo/Deferred"], function(ready, ObjectStore, Deferred) {
var store;
var def;
switch (fieldName) {
case "degree":
store = new degreeStore();
def = store.getJsonData();
break;
case "faculty":
store = new facultyStore();
def = store.getJsonData();
break;
default:
console.log("error in editOptionsDialog_fetchData: " + fieldName);
}
return def.then(function(data){
store.data = data.items;
editOptionsDialog_select.setStore(new ObjectStore({ objectStore : store }));
editOptionsDialog_select.store.query({ "id" : id });
editOptionsDialog_select.startup();
});
});
}
ここで、store.getJsonData()はDeferredを作成します。これは、Deferred解決を連鎖させるために使用します(本文の後の追加コードを参照してください)。
私が受け取るエラーは
editOptionsDialog_fetchData(id, fieldName).then(function(data)...) is undefined
openEditor関数にアクセスした直後にエラーメッセージが表示されるため、コールバックがまだ行われていないため、関数呼び出しの値を未定義にする必要があることは明らかです。
私の質問は、遅延APIのこの誤解が私のコード内にある必要がある場合です。これは、非同期呼び出しが実行されて呼び出されたときにeditOptionsDialogの関数呼び出しを評価することであり、この呼び出しが終了する前ではないためです(関数呼び出しがまだ未定義につながる状態ですが、これがthen-returnの目的だと思いました)。
あなたの助けのためのThx
--- getJsonData()の追加コード---
getJsonData: function() {
return xhr(this.handlerUrl, {
handleAs: "json",
method: "POST",
data: {
action: "getJsonData"
}
}).then(function(data){
return data;
}, function(err){
alert("Data cannot be fetched in degreeStore.getJsonData! " + err);
});
}