2014-01-27 5 views
0

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

$scope.fetchAllPlayers = function() { 
    $scope.players = PlayerFact.query({ 
      active: true 
     }, 
     undefined, 
     function() { 
      console.log('set fetchPlayersFailed to true!!!!'); 
      $scope.fetchPlayersFailed = true; 
     } 
    ); 
}; 

А вот тестовый код:

it('fetchAllPlayers: should set fetchPlayersFailed to true when error happens', function() { 
    httpBackend.expectGET('/api/players?active=true').respond(500); 
    scope.fetchAllPlayers(); 
    httpBackend.flush(); 
    expect(scope.fetchPlayersFailed).toEqual(true); 
    }); 

После того как я запустить юнит-тесты, вот консольный вывод ошибки:

Chrome 32.0 (Windows) LOG: 'set fetchPlayersFailed to true!!!!' 
Chrome 32.0 (Windows) Controller: PlayerCtrl fetchAllPlayers: should set fetchPl 
ayersFailed to true when error happens FAILED 
     Expected false to equal true. 
     Error: Expected false to equal true. 
      at null.<anonymous> (C:/Users/I056958/Documents/My Own/javascript wo 
rkspace/redjoker/test/spec/controllers/player.js:111:38) 
Chrome 32.0 (Windows) LOG: 'set fetchPlayersFailed to true!!!!' 
Chrome 32.0 (Windows): Executed 5 of 5 (1 FAILED) (0.297 secs/0.043 secs) 

Обратите внимание, что там уже 2 журнала выхода: 'установленные fetchPlayersFailed истина !!!!' Это означает, что обратный вызов ошибки действительно вызывается, а не один раз, дважды!

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

$scope.fetchAllPlayers = function() { 
       $scope.players = PlayerFact.query({ 
         active: true 
        }, 
        undefined, 
        undefined, 
        function() { 
         console.log('set fetchPlayersFailed to true!!!!'); 
         $scope.fetchPlayersFailed = true; 
        } 
       ); 
      }; 

Так что я м путаются обратные вызовы (ниже приводится цитата из официального углового документа)

HTTP GET "class" actions: Resource.action([parameters], [success], [error]) 
non-GET "class" actions: Resource.action([parameters], postData, [success], [error]) 
non-GET instance actions: instance.$action([parameters], [success], [error]) 
  1. по угловому официальному документу, запрос просто сокращение для Метод GET, возвращающий объект - массив, поэтому должно быть только 3 необязательных параметров: [параметры], [успех], [ошибка], тогда почему обратный вызов моего первого кода версии - это обратный вызов успеха, он должен быть точным обратным вызовом.

  2. Даже если обратный вызов моей первой версии является успешным обратным вызовом, почему будет , вызываемый дважды? Потому что в моем тестовом коде я ответил на 500, поэтому его вообще не нужно вызывать.

ответ

0

Do $ rootScope. $ Apply() до $ httpBackend.flush(), и это должно работать.

Отклонение: $scope.players = не делает то, что вы думаете. Вы должны установить его в своем обратном вызове успеха через $ resource (...). Получить или через последующий обратный вызов из обещания (предпочтительный шаблон).

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