我正在尝试编写一个返回诺言的函数。但是有时候,所请求的信息会立即可用。我想将其包装在一个承诺中,这样消费者就不必做出决定了。
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);
});
问题在于,对于预解析的Promise不会执行回调。这是合法的事情吗?有没有更好的方法来处理这种情况?
克鲁德。我的生命损失了一个小时。我在单元测试中进行了尝试,并且在测试完成后就实现了承诺,但是我没有看到它。我的测试有问题,而不是代码。
—
Craig Celeste 2013年
确保调用$ scope。$ apply()来确保在测试过程中一切立即解决。
—
dtabuenc 2013年
我认为httpbackend.flush解决了这个问题,但$ q可能没有。我在此测试中未使用范围。我正在直接测试服务,但是无论如何我都能正常工作。
—
Craig Celeste
return $q.when(Cache[id])
。无论如何,由于每次都创建新的Promise,所以每次都应该工作并调用回调。