【问题标题】:angularjs handling $resource $promise errorsangularjs 处理 $resource $promise 错误
【发布时间】:2014-08-01 22:42:11
【问题描述】:

如果连接到我的 API 时出现错误,有人可以帮我弄清楚如何在我的 AngularJS 工厂中返回硬编码数据。我的硬编码数据位于另一个名为“dataFactory”的工厂中。感谢您的帮助。

service.factory("ScheduleFactory", ['$http', '$resource', '$q', 'dataFactory', function($http, $resource, $q, dataFactory) {
        var objFactory = {};

        objFactory.getDaysOfWeek = function(includeWeekends) {
            var days = [];
            var API  = $resource(restURL + '/daysOfWeek/');

            API.query()
                .$promise
                    .then(function(data) {
                        isEmpty = (data.length === 0);

                        if (!isEmpty) {
                            days    = data;
                        };
                    })
                    .catch(function(error) {
                        console.log("rejected " + JSON.stringify(error));

                        var data    = null;
                        days    = dataFactory.daysOfWeek;

                        console.log(days.length); // returns 5
                    });


            console.log("after promise " + days.length);  // returns 'after promise 0'

            return days;
        };

我的dataFactory定义如下:

dataApp.factory("dataFactory", function() {
    objDataFactory  = {};

    objDataFactory.daysOfWeek = [
        {   dayName:        'Monday'
            , dayAbbrev:    'Mon'
            , index:        1
            , isSelected:   false
            , isWeekday:    true    }
        , { dayName:        'Tuesday'
             , dayAbbrev:   'Tue'
             , index:       2
             , isSelected:  false
             , isWeekday:   true    }
        , { dayName:        'Wednesday'
             , dayAbbrev:   'Wed'
             , index:       3
             , isSelected:  false
             , isWeekday:   true    }
        , { dayName:        'Thursday'
             , dayAbbrev:   'Thu'
             , index:       4
             , isSelected:  false
             , isWeekday:   true    }
        , { dayName:        'Friday'
             , dayAbbrev:   'Fri'
             , index:       5
             , isSelected:  false
             , isWeekday:   true    }
    ];

    return objDataFactory;
});

【问题讨论】:

    标签: javascript angularjs angular-resource angular-promise


    【解决方案1】:

    我想这就是你要找的东西:

    service.factory("ScheduleFactory", ['$http', '$resource', '$q', 'dataFactory', function($http, $resource, $q, dataFactory) {
         var objFactory = {};
    
         objFactory.getDaysOfWeek = function(includeWeekends) {
              var API  = $resource(restURL + '/daysOfWeek/'), defObj = $q.defer();
    
              var daysQuery = API.query();
              daysQuery.$promise.then(function(data) {
                        //you can add anything else you want inside this function
                        defObj.resolve(data);
                   }, function(error) {
                        //you can add anything else you want inside this function
                        defObj.resolve(dataFactory.daysOfWeek);
                   });
    
                return defObj.promise;
            };
    

    我已跳过任何数据格式和分配详细信息,因为无论如何您都可能更改它们。通过将 API 查询包装在额外的 Promise 中,您可以获得操作返回内容的能力。如果您的 API 可以访问,您将根据您的外部承诺从它返回数据。否则,您将根据您的外部承诺从其他服务返回硬编码数据。

    【讨论】:

    • @MBielski-感谢您的反馈。尝试了您的解决方案,但除了来自 API 的 404 之外,它没有返回任何内容,也没有返回任何错误。我在控制器中分配了 varPromise = ScheduleFactory.getDaysOfWeek() 。然后做了: varPromise.then(function(data) { $scope.days = data });没有成功。我做错了吗?
    • 抱歉,在我的代码(第二个 then 子句)中看到了复制/粘贴问题并将其删除。现在它应该可以正常工作了。
    • 不要使用deferred antipattern
    • 有趣...我不知道这一点!感谢您让我注意到 Bergi。
    【解决方案2】:

    没有catch块,使用常规的错误回调函数:

       API.query()
            .$promise
                .then(function(data) {
                        isEmpty = (data.length === 0);
    
                        if (!isEmpty) {
                            days    = data;
                     },
                     function(error) { // removed catch here
                        console.log("rejected " + JSON.stringify(error));
    
                        var data    = null;
                        days    = dataFactory.daysOfWeek;
    
                        console.log(days.length); // returns 5
                    ...
    

    docs

    then(successCallback, errorCallback, notifyCallback) – 无论承诺何时被解决或被拒绝,只要结果可用,就会异步调用成功或错误回调之一。使用单个参数调用回调:结果或拒绝原因。此外,在解决或拒绝承诺之前,可能会调用通知回调零次或多次以提供进度指示。

    【讨论】:

    • @shomz-感谢您的反馈。尝试了您的解决方案并使用了 console.log 语句“返回 5”。然而,一旦它退出了 promise 调用,“days”仍然没有被填充。 'after promise' 仍然显示 0。
    • 错误说明了什么?这就是我首先要解决的问题。您的问题是关于处理错误的,老实说,我没有检查服务失败的原因。
    • @shomz- 除了 404 之外,没有返回任何控制台错误。抱歉,如果我的问题不清楚。我想处理的错误是我的 API 没有连接。我已经尝试了错误回调,但无济于事 - 没有返回记录。 MBielski 的解决方案成功了。不过,感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-10-14
    • 2016-08-02
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 2016-07-24
    相关资源
    最近更新 更多