免责声明-我已经审查了现有的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变量)。
有人可以澄清我做错了什么以及如何解决吗?
编辑-做出更改后,托马斯·厄普顿(Thomas Upton)建议,我离得更近,但是我遇到了一个奇怪的错误。
我在getPicklist之后添加了以下功能:
returnPicklistName: function () {
this.getPicklist().then(function (picklistName) {
return picklistName;
})
},
因为我真正想要的只是选择列表(确实需要JSON,但现在我只选择这个选择列表)。
这会在Chrome开发工具中引发以下错误-未捕获的TypeError:对象[object Object]没有方法'getPicklist'。
我还想念什么?谢谢。
最佳答案
您需要返回一个promise(此处是picklistName
的结果)并添加一个回调,该回调将在延迟解决时接收到getPicklist
,而不是在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
});