【发布时间】:2013-12-31 13:41:55
【问题描述】:
我正在尝试编写一个返回承诺的函数。但有时要求的信息会立即可用。我想把它包装在一个承诺中,这样消费者就不需要做出决定了。
function getSomething(id) {
if (Cache[id]) {
var deferred = $q.defer();
deferred.resolve(Cache[id]); // <-- Can I do this?
return deferred.promise;
} else {
return $http.get('/someUrl', {id:id});
}
}
并像这样使用它:
somethingService.getSomething(5).then(function(thing) {
alert(thing);
});
问题是回调没有为预先解决的承诺执行。这是合法的做法吗?有没有更好的方法来处理这种情况?
【问题讨论】:
-
在第一种情况下编写返回的更简单的方法是
return $q.when(Cache[id])。无论如何,这应该可以工作并每次都调用回调,因为您每次都在创建新的 Promise。 -
粗鲁。我生命中的一个小时失去了。我在单元测试中尝试了这个,并且在测试完成后实现了承诺,但我没有看到它。我的测试有问题,而不是代码。
-
确保调用 $scope.$apply() 以确保在测试期间问题立即解决。
-
我认为 httpbackend.flush 说明了这一点,但 $q 可能没有。我没有在这个测试中使用范围。我正在直接测试服务,但我还是让它工作了,谢谢。