免责声明 - 我已经审核了现有的SO条目,并将 应该工作的内容拼凑在一起,但仍然没有。
我有以下功能。基本上它是将一对值发送到Web服务,结果以JSON格式返回:
getPicklist: function () {
var xhrArgs = {
url: 'myUrl',
postData: dojo.toJson({
'opportunityId': 'myOppId',
'loggedInUserId': 'myUserId' //App.context.user.$key
}),
headers: {
"Content-Type": "application/json"
}
}
var deferred = dojo.xhrPost(xhrArgs);
deferred.then(
function (data) {
var jsonResponse = dojo.fromJson(data);
picklistName = jsonResponse.PicklistName;
if (!picklistName) {
picklistName = "defaultPickListName";
}
return picklistName;
},
function (error) {
alert("Could not load picklist " + error);
});
;
//return picklistName; -- null
}
阅读本文后我的理解: anonymous js function with xhrpost dojo not returning data
是否在此函数范围之外添加变量以及使用dojo.deferred会解决此问题。我尝试在函数外部放置一个var,并将该对象分配给picklistName变量。
但是,我仍然无法获得此函数的结果(picklistName变量)。
有人可以澄清我做错了什么,以及如何解决它?
编辑 - 托马斯厄普顿建议改变后,我更接近但我得到一个奇怪的错误。我在getPicklist之后添加了以下函数:
returnPicklistName: function () {
this.getPicklist().then(function (picklistName) {
return picklistName;
})
},
因为我真正想要的只是选项列表(我想要的是JSON,但我现在只会选择这个选项列表)。
这会在Chrome开发工具中引发以下错误 - 未捕获TypeError:对象[object Object]没有方法'getPicklist'。
我还想念什么?感谢。
答案 0 :(得分:1)
而不是在picklistName
的末尾返回getPicklist
,而是需要返回promise - 这里是then()
的结果 - 并添加一个回调将在延期结算后收到picklistName
。
getPicklist: function () {
// ...
var deferred = dojo.xhrPost(xhrArgs);
return deferred.then(
function(data) { /* get picklistName from data */ return picklistName; },
function(error) { /* ... */ }
);
}
然后,当您致电getPicklist
时:
this.getPicklist()
.then(function(picklistName) {
// Use picklistName here
});