$promise
是由 $resource Service 类型的操作方法返回的对象的一个属性。
重要的是要意识到调用
$resource
对象方法会立即返回一个空引用(对象或数组,具体取决于
isArray
)。一旦数据从服务器返回,现有的引用将填充实际数据。
资源实例和集合还具有以下其他属性:
-
$promise
: 创建此实例或集合的原始服务器交互的 Promise。
在成功时,
promise 会解析为相同的资源实例或集合对象,并使用来自服务器的数据进行更新。这使得在
$routeProvider.when() 的 resolve 部分 中使用它很容易,以推迟视图渲染直到资源加载完成。
在失败时,Promise 将被拒绝,并带有
http 响应 对象,但不包括资源属性。
--AngularJS $resource 服务 API 参考
注意:问题中的示例代码是多余且不必要的。
$scope.module = moduleFactory.get({id: $stateParams.id})
.$promise.then(function(response){
});
将解决的响应分配给$scope并不是必须的,因为当结果来自服务器时,
$resource将自动填充引用。只有在代码需要处理结果
之后,才使用
$promise属性。
要区分返回
$resource Service对象的服务和返回promises的其他服务,请查找
.then
方法。如果对象具有
.then
方法,则它是一个promise。如果它具有
$promise
属性,则遵循
ngResource模式。
显然,您已经注意到了,我在$q.all()中使用了一个$resource.$promise的数组,它可以工作。
$q.all适用于任何来源的promises。在幕后,它使用$q.when将值或promises(任何then-able对象)转换为$q Service promises。
$q.all与其他promise库中的all
方法不同之处在于,它不仅适用于数组,还适用于具有promise属性的JavaScript对象。可以创建一个promise哈希(关联数组)并使用$q.all来解析它。
var resourceArray = resourceService.query(example);
var hashPromise = resourceArray.$promise.then(function(rArray) {
promiseHash = {};
angular.forEach(rArray,function (r) {
var item = resourceService.get(r.itemName);
promiseHash[r.itemName] = item.$promise;
});
return $q.all(promiseHash);
});
hashPromise.then(function (itemHash) {
console.log(itemHash);
});
上面的例子创建了一个以itemName为索引的项哈希,所有项都是从
$resource Service异步获取的。
$promise
是某些操作返回值上的一个属性,它返回该操作结果的一个Promise。$q
是一个服务,提供了一些Promise创建和操作机制,如$q.all
和$q.resolve
。 - JLRishe