Я использую $q.when, чтобы обернуть другой lib promises. Он работает как прелесть, но когда я пытаюсь запустить его внутри Karma, обещание не удается разрешить ( done() никогда не выполняется), даже если я запустил $digest и даже после тайм-аут. Вот пример кода:
describe('PouchDB', function () {
var $q, $rootScope;
beforeEach(inject(function (_$rootScope_, _$q_) {
$rootScope = _$rootScope_;
$q = _$q_;
}));
it("should run", function (done) {
function getPromise() {
var deferred = Q.defer();
deferred.resolve(1);
return deferred.promise;
}
$q.when(getPromise())
.then(function () {
done(); // this never runs
});
$rootScope.$digest();
});
Почему? Какова причина этого? Я действительно не могу это получить.
Обновление (обходной путь)
Я не понимаю, почему $q.when не разрешен в Karma - он имеет что-то с функцией nextTick, но я не могу отладить проблему. Вместо этого я бросил $q.when и написал простую функцию, которая преобразует PouchDB (или любой другой, такой как Q) в $q:
.factory('$utils', function ($q, $rootScope) {
return {
to$q: function (promise) {
var deferred = $q.defer();
promise.then(function (result) {
deferred.resolve(result);
$rootScope.$digest();
});
promise.catch(function (error) {
deferred.reject(error);
$rootScope.$digest();
});
return deferred.promise;
}
}
})