Я знаю, что вызов $digest
или $apply
вручную во время цикла дайджеста приведет к ошибке "$ digest уже в процессе", но я понятия не имею, почему я получаю его здесь.
Это unit test для службы, которая обертывает $http
, эта услуга достаточно проста, она просто предотвращает дублирование вызовов на сервере, обеспечивая при этом, что код, который пытается выполнять вызовы, по-прежнему получает ожидаемые данные.
angular.module('services')
.factory('httpService', ['$http', function($http) {
var pendingCalls = {};
var createKey = function(url, data, method) {
return method + url + JSON.stringify(data);
};
var send = function(url, data, method) {
var key = createKey(url, data, method);
if (pendingCalls[key]) {
return pendingCalls[key];
}
var promise = $http({
method: method,
url: url,
data: data
});
pendingCalls[key] = promise;
promise.then(function() {
delete pendingCalls[key];
});
return promise;
};
return {
post: function(url, data) {
return send(url, data, 'POST');
},
get: function(url, data) {
return send(url, data, 'GET');
},
_delete: function(url, data) {
return send(url, data, 'DELETE');
}
};
}]);
Единичный тест также довольно прямолинейный, он использует $httpBackend
для ожидания запроса.
it('does GET requests', function(done) {
$httpBackend.expectGET('/some/random/url').respond('The response');
service.get('/some/random/url').then(function(result) {
expect(result.data).toEqual('The response');
done();
});
$httpBackend.flush();
});
Это сработает как sone, так как done()
вызывается с ошибкой "$ digest is in progress". Я понятия не имею, почему. Я могу решить это, обернув done()
в таймаут, подобный этому
setTimeout(function() { done() }, 1);
Это означает, что done()
будет стоять в очереди и запускаться после выполнения $digest, но пока это решает мою проблему, я хочу знать
- Почему Angular в цикле дайджеста в первую очередь?
- Почему вызов
done()
вызывает эту ошибку?
У меня был тот же самый тест, который работал зеленым с Jasmine 1.3, это произошло только после того, как я обновился до Jasmine 2.0 и переписал тест, чтобы использовать новый синтаксис асинхронизации.