Переменная Область Dojo xhrPost
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ - Я рассмотрел существующие записи SO и собрал воедино то, что должно работать, но все еще не работает.
У меня есть следующая функция. В основном это отправка пары значений в веб-сервис с результатами, возвращающимися в 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
}
Мое понимание после прочтения этого: анонимная функция js с xhrpost dojo не возвращает данные
Было ли то, что добавление переменной за пределы этой области функции вместе с использованием dojo.deferred решило бы проблему. Я попытался поместить переменную вне функции и назначил объект переменной picklistName.
Тем не менее, я все еще не могу получить результат этой функции (переменная picklistName).
Может кто-нибудь уточнить, пожалуйста, что я делаю неправильно, и как я могу это исправить?
РЕДАКТИРОВАТЬ - После внесения изменений предложил Томас Аптон, я ближе, но я получаю странную ошибку.
Я добавил следующую функцию после getPicklist:
returnPicklistName: function () {
this.getPicklist().then(function (picklistName) {
return picklistName;
})
},
Потому что все, что я действительно хочу, это список выбора (есть JSON, который я действительно хочу, но сейчас я остановлюсь только на списке выбора).
Это приводит к следующей ошибке в инструментах разработчика Chrome - Uncaught TypeError: Object [object Object] не имеет метода getPicklist.
Что еще я пропустил? Благодарю.
1 ответ
Вместо возвращения 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
});