我对 dojo 很陌生,但是在处理 Deferred API 时遇到了一定的错误,我无能为力
我的调用代码是
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 函数后立即出现,很明显,函数调用的值必须是未定义的,因为回调尚未完成。
我的问题是,对 Deferred API 的这种误解必须在我的代码中,因为目的是在异步调用完成并被调用后立即评估 editOptionsDialog 的函数调用,而不是在此调用完成之前(在函数调用仍然导致未定义的状态,但我认为这是 then-return 的目的)。
谢谢你的帮助
--- 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);
});
}