deferred.resolve выдает ошибку TypeError: undefined не является функцией

Я использую angularjs и инструмент cordova для создания приложения.

Я создал сервис, который содержит код для вызова API. и в этом я хочу вернуть ответ моему угловому контроллеру.

Мой код, Сервис,

JodoModule.factory('commonServices', function ($http, $q, $rootScope) {
    return {
        getServiceData: function (url) {
            $rootScope.loading = true;
            var deferred = $q.defer();
            var req = {
                method: 'GET',
                url: url
            }

            $http(req).success(function (data) {
                alert("data in service = " + JSON.stringify(data.Data));
                deferred.resolve(data);
            }).error(function (data, status, headers, config) {
                deferred.reject(status);
            });
            return deferred.promise;
        }
    };
});

Мой контроллер,

commonServices.getServiceData("My url").
            success(function (data, status, headers, config) {
                alert(data);
            }).
            error(function (data, status, headers, config) {
                alert("Got error");
            });

В приведенном выше коде в сервисе отображается предупреждающее сообщение для JSON.stringify(data.Data)); в блоке успеха, поэтому данные поступают, но не выполняются deferred.resolve(data); правильно...

в веб-панели инструментов выдает ошибку ie. TypeError: undefined is not a function

Мой О/П:

{"status":"SUCCESS","Message":"success","Token":"","Data":[{"Id":17,"UserId":"477f1919-6b80-4804-a325-ac0cb05bcd3e","UserName":"honey","FirstName":"honey","LastName":null,"ProfilePic":false,"Status":2}]}

Как я могу решить эту ошибку. ?


person Keval Patel    schedule 03.03.2015    source источник


Ответы (1)


Обычные обещания $q не имеют метода .success() или .error(), но вы не должны использовать отложенный антишаблон в любом случае. Вместо этого сделайте следующее:

JodoModule.factory('commonServices', function ($http, $rootScope) {
    return {
        getServiceData: function (url) {
            $rootScope.loading = true;
            var req = {
                method: 'GET',
                url: url
            };

            return $http(req).then(function (result) {
                alert("data in service = " + JSON.stringify(result.data.Data));
                return result.data;
            });
        }
    };
});

Контроллер:

commonServices.getServiceData("My url").
        then(function (data) {
            alert(data);
        }).
        catch(function (result) {
            alert("Got error");
        });

Немного чище, а?

person JLRishe    schedule 03.03.2015
comment
Можете ли вы сказать мне, что здесь ловить ...? Потому что это дает мне ошибку JavaScript: использование ключевого слова в качестве идентификатора недопустимо. - person Keval Patel; 03.03.2015
comment
Ваше решение работает, я использую этот код в контроллере commonServices.getServiceData(URL). затем (функция (данные) { предупреждение (данные); }); Пожалуйста, укажите, что такое ключевое слово catch в данном решении... Все остальное работает... Спасибо... ура :) Сэкономленное время... - person Keval Patel; 03.03.2015
comment
@KevalPatel catch описан в документации $q: docs. angularjs.org/api/ng/service/$q#the-promise-api - person JLRishe; 03.03.2015