【发布时间】:2015-07-24 01:07:09
【问题描述】:
我正在学习 Angular,我遇到了两种方法来进行返回承诺的调用。我想知道一种方法是否比另一种更好和/或何时使用每种方法。
第一个技巧:
function getSomeDataFromServer() {
var deferred = $q.defer();
if (myData) {
// call to backend was previously made and myData is already loaded
deferred.resolve(myData);
} else {
// get data from server
$http.get(my_url_endpoint).then(function(response) {
// cacheResult() will set myData = response.data
deferred.resolve(cacheResult(response));
});
}
return deferred.promise;
}
第二种技巧:
function getSomeDataFromServer() {
if (myData) {
// call to backend was previously made and myData is already loaded
return $q.when(myData);
} else {
// get data from server
return $http.get(my_url_endpoint).then(function(response) {
// cacheResult() will set myData = response.data
return cacheResult(response);
});
}
}
【问题讨论】:
-
不确定你的 getter 函数是否应该关心数据是否已经可用 - 听起来像控制器应该处理它。另一件事:如果浏览器缓存该 http 请求,您的第一种技术将成为反模式。
-
第一个是deferred antipattern(并且无法转发错误)。您可能还想看看Caching a promise object in AngularJS service
-
作为延迟反模式的副本关闭。我可能只会做
var cached = null; function getSomeDataFromServer(){ return cached || (cached = $http.get(...)) }或类似的事情。
标签: javascript angularjs promise angular-promise