Pergunta

Alguém poderia me ajudar a descobrir como retornar dados codificados em minha fábrica AngularJS se houver um erro ao conectar-se à minha API.Meus dados codificados estão localizados em outra fábrica chamada "dataFactory".Agradeço a ajuda.

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

Meu dataFactory é definido da seguinte forma:

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;
});
Foi útil?

Solução

Eu gostaria de pensar que é isso que você está procurando:

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

Ignorei qualquer formatação de dados e detalhes de atribuição porque você poderá alterá-los de qualquer maneira.Ao envolver sua consulta de API em uma promessa extra, você ganha a capacidade de manipular o que é retornado.Se sua API puder ser acessada, você retornará os dados dela na resolução de sua promessa externa.Caso contrário, você retornará seus dados codificados de seu outro serviço na resolução de sua promessa externa.

Outras dicas

Sem bloco catch, use uma função de retorno de chamada de erro regular:

   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
                ...

Veja no documentos:

então(sucessoCallback, erroCallback, notifyCallback) – independentemente de quando a promessa foi ou será resolvida ou rejeitada, então chama um dos retornos de chamada de sucesso ou erro de forma assíncrona assim que o resultado estiver disponível.Os retornos de chamada são chamados com um único argumento:o resultado ou motivo da rejeição.Além disso, o retorno de chamada de notificação pode ser chamado zero ou mais vezes para fornecer uma indicação de progresso, antes que a promessa seja resolvida ou rejeitada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top