我正在使用AngularJS管理应用。该应用程序使用$ resource从服务器获取其数据。我最终得到的数据对象包含' $ promise'用于确定何时获取数据的属性。 一切都很好。
现在,此管理员应用程序还可以创建新对象。这些新对象由通常来自' $ resource'的控制器管理。
所以现在我有两种物体:
我想减少代码并拥有一个用例,不必检查对象数据是否已解析,或者它是否不是一个承诺。
建立我的平原是否有任何问题?对象通过添加' $ promise'已经解决了自己的财产?这样,我总是会使用' myObject。$ promise.then()'。
是否有任何常见的模式来处理这种情况?我找不到任何标准'用Angular创建这种对象的方法。
答案 0 :(得分:1)
如果不确定对象是否有承诺,您可以使用$q.when。
(obj.$promise ? obj.$promise || $q.when(objResult)).then(function(result){
//handle success case.
//Incase of object not having the $promise property result will be object itself
})
如果结果属性没有承诺,则会以承诺解决。
将可能是值的对象或(第三方)包装成$ q承诺。当您处理可能会或可能不是承诺的对象,或者承诺来自不可信任的来源时,这非常有用。
您不需要始终创建承诺并将其附加到正在传输的数据上,而是可以使您的方法返回promise,从而帮助您实现承诺模式并抽象出服务本身的承诺逻辑。例如: -
function getCurrentUserData(userId){
var defered = $q.defer();
...
//Check in my cache if this is already there, then get it from cache and resolve it
defered.resolve(objectFromCache);
//my else condition
//It is not in cache so let me make the call.
$http.get('myurl').then(function(result){
//Do validation with data and if it doesnot match then reject it
defered.reject(reason);
//Else Do something with the data put it into the cache, mapping logic etc..
defered.resolve(dto);
}).catch(function(error){
//do something with error and then reject
defered.reject(reasonDerived);
});
return defered.promise;
}
这是一个简化且不太明确的版本(图片来源:Benjamin Gruenbaum):
var cached = null;
function getCurrentUserData(userId){
return cached = cached || $http.get('myurl').then(function(result){
if(isNotValid(result)) return $q.reject(reason); // alternatively `throw`
return transformToDto(result);
}, function(response){
if(checkforsomethingonstatusandreject)
return $q.reject('Errored Out')
//do some actions to notify the error scenarios and return default actions
return someDefaults; });
}
你当然可以return $q.reject(derivedReason)
而不是返回原因并根据进一步的检查对其进行转换,这个想法是缓存承诺而不是价值。如果在返回一次之前调用该方法,这也具有不发出多个http请求的优点。
现在你可以随时: -
getCurrentUserData(userid).then(function(user){
}).catch(function(error){
});
承诺也可以链接。所以你也可以这样做: -
return $resource('myresource').$promise.then(function(result){
//Do some mapping and return mapped data
return mappedResult;
});
答案 1 :(得分:0)
A + promises应提供静态方法:
Promise.resolve(val);
...产生预先解决的承诺。如果您的承诺库提供此功能,您应该返回其中一个。大。我经常这样做以避免界面重复。