【问题标题】:deferred.resolve giving error TypeError: undefined is not a functiondeferred.resolve 给出错误 TypeError: undefined is not a function
【发布时间】:2015-05-04 09:28:25
【问题描述】:

我正在使用 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)) 的 elert 消息;在成功块中,所以数据正在到来,但它没有执行 deferred.resolve(data);妥妥的……

在 Web 工具栏中出现错误, ie. TypeError: undefined is not a function

我的 o/p 是:

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

我该如何解决这个错误。 ?

【问题讨论】:

    标签: angularjs cordova angularjs-scope angularjs-service angularjs-factory


    【解决方案1】:

    普通的 $q 承诺没有 .success().error() 方法,但无论如何你都不应该使用 deferred antipattern。而是这样做:

    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");
            });
    

    干净一点,是吗?

    【讨论】:

    • 你能告诉我这里有什么……吗?因为它给了我 JavaScript 错误:使用关键字作为标识符是无效的。
    • 您的解决方案正在运行,我在控制器 commonServices.getServiceData("URL") 中使用此代码。然后(函数(数据){警报(数据);});请说明,您给定的解决方案中的 catch 关键字是什么...其他一切正常...谢谢...欢呼:) 节省时间...
    • @KevalPatel catch 在 $q 文档中有所描述:docs.angularjs.org/api/ng/service/$q#the-promise-api
    猜你喜欢
    • 1970-01-01
    • 2015-10-11
    • 2015-06-24
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 2015-11-06
    • 2014-09-18
    相关资源
    最近更新 更多