Angular Promises:不同技术的最佳实践和 Pros/Cons
Angular Promises: Best Practices and Pros/Cons of Different Techniques
我正在学习 Angular 并且我遇到了两种调用 return 承诺的方法。我想知道当您使用每种方法时,一种方法是否优于另一种方法 and/or。
第一个技巧:
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);
});
}
}
总是喜欢第二个选项。第一个选项是一种反模式,通常在开发人员不完全理解承诺的性质时出现。使用延迟对象 (var deferred = $q.defer();
) when you have some asynchronous code that uses callbacks but needs to work with your promise based code.
您在 Angular return promises 中执行的大多数异步操作,因此您通常只会在使用依赖于回调的第 3 方库时使用延迟。
在此示例中,$http 本身 return 是一个承诺,因此无需创建新的延迟对象。返回 $http 承诺本身就足够了。
我正在学习 Angular 并且我遇到了两种调用 return 承诺的方法。我想知道当您使用每种方法时,一种方法是否优于另一种方法 and/or。
第一个技巧:
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);
});
}
}
总是喜欢第二个选项。第一个选项是一种反模式,通常在开发人员不完全理解承诺的性质时出现。使用延迟对象 (var deferred = $q.defer();
) when you have some asynchronous code that uses callbacks but needs to work with your promise based code.
您在 Angular return promises 中执行的大多数异步操作,因此您通常只会在使用依赖于回调的第 3 方库时使用延迟。
在此示例中,$http 本身 return 是一个承诺,因此无需创建新的延迟对象。返回 $http 承诺本身就足够了。