2015-11-19 4 views
2

Позвольте мне начать с того, что я нахожусь в нулевом уголке, поэтому я подозреваю очень тупую ошибку, основанную на моем непонимании.Перехватчик Angularjs 1.4 не работает

Я пытаюсь создать перехватчик для обработки запросов и ошибок ответа.

Если я поставил предупреждение в верхней части файла, он вызывается, поэтому файл загружается. Но никто из других предупреждений, включая нижнюю часть файла и до конфигурации, не вызван. ОтветError и requestError никогда не вызываются ...

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

$provide.factory('myHttpInterceptor', function ($q, dependency1, dependency2) { 
    return { 
     'responseError': function (rejection) { 
      alert("Something went wrong"); 
      return $q.reject(rejection); 
     }, 
     'requestError': function (rejection) { 
     alert("Something went wrong"); 
     return $q.reject(rejection); 
    } 
    }; 
}); 
alert('myHttpInterceptor done'); 
module.config(['$httpProvider', function ($httpProvider) { 
    alert('myHttpInterceptor push'); 
    $httpProvider.interceptors.push('myHttpInterceptor'); 
}]); 

любой помощь, особенно по отношению к твердому пониманию того, что происходит очень ценится

---- связанный ответ информации для потомков ----

На основе комбинации на sbedulins и Angad ответы Я смог получить это работы.

Во-первых, как только я получил это работает он работал с и без одинарные кавычки вокруг responeError и RequestError ...

dependency1 и 2 были определены и ошибки вырезания и вставки из упрощенного примера я получил здесь ТАК. Поэтому я удалил их.

Затем я заменил модуль на angular.module ('defaultApp'), поэтому модуль является заполнителем в примерах, а не каким-то удобным глобальным хранилищем ... вам нужно явно определить ваш модуль (или переменный модуль) (да я на самом деле, что новый для угловой)

так, как только все эти изменения были применены к примерам sbedulins, я получил рабочий код здесь для обоих подходов, для postetity вот мой actyual рабочий код из моего приложения

angular.module('defaultApp').config(['$provide', '$httpProvider', function ($provide, $httpProvider) { 

    $provide.factory('myHttpInterceptor', function ($q) { 
     return { 
      responseError: function (rejection) { 
       alert("Something went wrong"); 
       return $q.reject(rejection); 
      }, 
      requestError: function (rejection) { 
       alert("Something went wrong"); 
       return $q.reject(rejection); 
      } 
     }; 
    }); 

    $httpProvider.interceptors.push('myHttpInterceptor'); 

}]); 

OR

angular.module('defaultApp').config(['$httpProvider', function ($httpProvider) { 

    $httpProvider.interceptors.push(function ($q) { 
     return { 
      'responseError': function (rejection) { 
       alert("Something went wrong"); 
       return $q.reject(rejection); 
      }, 
      'requestError': function (rejection) { 
       alert("Something went wrong"); 
       return $q.reject(rejection); 
      } 
     }; 
    }); 

}]); 

Спасибо за тонну за вашу помощь, я узнал важные вещи о сокращении углов в примерах. sbedulin получает ответ, даже если мне нужна помощь от комментариев, чтобы получить его/ее ответ на работу

+1

попробуйте удалить одинарные кавычки из 'requestError' и 'responseError' –

+1

как вы определяете 'module'?Также где определены 'dependency1',' dependency2' (они вводятся в ваш перехватчик) – Angad

ответ

2

перехватчики через $provide должны быть определены на config этапе, непосредственно перед нажатием его $httpProvider.interceptors

module.config(['$provide', '$httpProvider', function ($provide, $httpProvider) { 

    $provide.factory('myHttpInterceptor', function ($q, dependency1, dependency2) { 
     return { 
      'responseError': function (rejection) { 
       alert("Something went wrong"); 
       return $q.reject(rejection); 
      }, 
      'requestError': function (rejection) { 
       alert("Something went wrong"); 
       return $q.reject(rejection); 
      } 
     }; 
    }); 

    $httpProvider.interceptors.push('myHttpInterceptor'); 

}]); 

В качестве альтернативы, вы может подтолкнуть анонимную функцию, как это определено в docs

module.config(['$httpProvider', function ($httpProvider) { 

    $httpProvider.interceptors.push(function ($q, dependency1, dependency2){ 
     return { 
      'responseError': function (rejection) { 
       alert("Something went wrong"); 
       return $q.reject(rejection); 
      }, 
      'requestError': function (rejection) { 
       alert("Something went wrong"); 
       return $q.reject(rejection); 
      } 
     }; 
    }); 

}]); 

USECASE с рабочим plunker описано здесь disabling button while ajax request

+0

должен модуль. заменить на что-то вроде angular.module ('defaultApp').? –

+1

Да, сначала модуль создается с его зависимостями, например. 'var module = angular.module ('app', ['module1', 'module2']);'. Тогда на модуль может ссылаться либо глобальная переменная 'module', либо' angular.module ('app') 'без второго параметра (второй подход лучше, так как он не загрязняет глобальное пространство имен с помощью' module' var). Обратите внимание, что 'module1', 'module2', 'dependency1', 'dependency2' указаны только для примера. Для рабочего примера, пожалуйста, обратитесь к концевой ссылке моего ответа. – sbedulin

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