2015-05-14 2 views
0

Я использую Parse.com в качестве бэкэнд для приложения Ionic Framework, что означает, что я должен контролировать сетевую активность. Я могу работать онлайн/офлайн, используя этот guide. Тем не менее, мне нужно больше «приложений широкий» проверки решения для каждого вызова. В настоящее время я получаю сообщение об ошибке, когда нет сети, как response от сервера null вызывает следующую ошибку:Проверить сеть и обработать пустой объект ошибки

Error: null is not an object (evaluating 'response.error') 

Мой вопрос заключается в два раза:

  1. Можно ли создать сеть factory/service, что я могу ввести в мой ParseFactory, чтобы проверить и уведомить пользователя о том, что их сети недостаточно.

  2. Handle объекта null отклика в этом коде:

    ParseFactory.provider('Programme/').get($stateParams.loadProgramme).success (function(data){ 
    // do something with success... 
    }).error(function(response){ 
    $rootScope.$emit('errorEvent', 
        {"message" : "Unable to load Programme. Please check your connection", "errorObject": response.error} 
        ); 
    }); 
    

Моя фабрика для вызовов разбора ниже:

.factory('ParseFactory',['$http','PARSE_CREDENTIALS',function($http,PARSE_CREDENTIALS){ 
var baseUrl = 'https://api.parse.com/1/classes/'; 
    return { 
     provider:function(type, queryParam, queryValue) { 
      console.log(queryValue); 
      whereQuery = {} 
      whereQuery[queryParam] = queryValue; 

      var masterQuery = {'userId': masterKey}; 
      return { 
       getAll:function(){ 
        return $http.get(getUrl(type),getParams(whereQuery)); 
       }, 
       getMasters:function(){ 
        return $http.get(getUrl(type),getParams(masterQuery)); 
       }, 
       get:function(id){ 
        return $http.get(getUrl(type)+id,getParams()); 
       }, 
       create:function(data){ 
        return $http.post(getUrl(type),data,getParams()); 
       }, 
       edit:function(id,data){ 
        return $http.put(getUrl(type)+id,data,getParams()); 
       }, 
       delete:function(id){ 
        return $http.delete(getUrl(type)+id,getParams()); 
       } 
      } 
      function getUrl(type) { 
       return baseUrl+type; 
      } 

      function getParams(user) { 
       return { 
         timeout : 5000, 
         headers:{ 
          'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID, 
          'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY, 
          'X-Parse-Session-Token': Parse.User.current()._sessionToken, 
          'Content-Type':'application/json' 
         }, 
         params: { 
         where: user, 
         // limit: 2, 
         // count: 1 
         // include: "something" 
        }  
       }  
      } 
     } 
    } 
}]) 
+0

Что касается второго аргумента 'error', он должен предоставить вам код состояния – PSL

+0

Но статус приходит с сервера. Если нет сети для получения кода ошибки, это будет «null» – Taylorsuk

ответ

1

Используйте $http interceptor. Все запросы с использованием $ http передаются через перехватчики, поэтому с помощью перехватчиков вы можете применять глобальную обработку для успешных или неудачных запросов и ответов.

Например, перехватчик отменяет запрос, если сетевое соединение не доступно и выдает это событие, когда пустой ответ получен:

app.factory('networkActivityInterceptor', function($rootScope, $q, networkMonitorService) { 
    return { 
    'request': function(config) { 
     var canceller = $q.defer(); 
     config.timeout = canceller.promise; 

     if (!networkMonitorService.hasNetworkConnection()) { 
     // cancels the request if there is no network connection 
     canceller.resolve(); 
     } 

     // otherwise, let the request go through as normal 
     return config; 
    }, 

    'response': function(response) { 
     // handle a null/empty response 
     if (!response.data) { 
     $rootScope.$emit('errorEvent', { 
      message: 'Unable to load...', 
      errorObject: response.error 
     }); 
     } 

     return response; 
    }, 

    'responseError': function(response) { 
     // the response handling above could also be done in the responseError 
     // handler which is hit when an error HTTP code is returned. (example: 404, 500) 
     // this depends on what your server is configured to return. 

     // note that in a responseError handler you must return a rejected promise 
     // (i.e. return $q.reject(response);) 
    } 
    }; 
}); 

Заменитель networkMonitorService.hasNetworkConnection() логики сетевой активности вашего приложения.

+0

. Я как бы опустился в первом предложении здесь «Прежде чем приступать к созданию перехватчиков, обязательно ознакомьтесь с API-интерфейсами $ q и отложенными/обещаниями». вы могли бы дать мне очень быстрый пример? – Taylorsuk

+0

@ Тейлорсук уверен, обновите ответ. – user2943490

Смежные вопросы