【发布时间】:2014-06-13 18:00:31
【问题描述】:
我使用 $q.when 来包装其他 lib 承诺。 它就像一个魅力,但是当我尝试在 Karma 中运行它时,即使我运行了 $digest 甚至在之后,承诺也无法解决(done() 永远不会执行)暂停。 这是示例代码:
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;
}
}
})
【问题讨论】:
-
为什么要同时使用 Q 和 $q?也许 Karma(或它使用的 AngularMocks 库)期待由 $q.defer() 而不是 Q.defer() 生成的承诺
-
我使用 PouchDB,它有自己的 promise,所以我需要用 $q 包装它们。我在示例中使用 Q 只是为了简化事情 - 结果是一样的:$q.when 在包装外部承诺时没有在 Karma 中解决,这是 BTW 的主要目的 $q.when
标签: angularjs jasmine karma-runner