我正在学习角,我遇到了两种方法来打电话,回报承诺。我想知道一种方法是否比另一种更好,以及/或您何时使用这两种方法。
第一技术:
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);
});
}
}发布于 2015-05-12 23:36:28
总是喜欢第二种选择。第一种选择是一种反模式,当开发人员不完全理解承诺的本质时,通常会看到这种模式。延迟对象(var deferred = $q.defer();)使用当您有一些使用回调但需要使用基于承诺的代码的异步代码时。
您在角返回中所做的大多数异步操作都是承诺的,因此通常只在使用依赖回调的第三方库时才使用延迟。
在本例中,$http本身返回一个承诺,因此创建一个新的延迟对象是不必要的。返回$http承诺本身就足够了。
https://stackoverflow.com/questions/30203063
复制相似问题