Переменная Область 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
    });
Другие вопросы по тегам