我发现很难理解“延迟反模式”。我想我原则上理解它,但我还没有看到一个 super 简单的例子来说明什么是服务,具有不同的 promise 和反模式,所以我想我会尝试制作自己的服务,但看到我不是这样 super 了解它,我会先得到一些澄清。
我在工厂(SomeFactory)中有以下内容:
//url = 'data.json';
return {
getData: function(){
var deferred = $q.defer();
$http.get(destinationFactory.url)
.then(function (response) {
if (typeof response.data === 'object') {
deferred.resolve(response.data);
} else {
return deferred.reject(response.data);
}
})
.catch(function (error) {
deferred.reject(error);
});
return deferred.promise;
}
我检查其对象的原因只是为了在 $http.get()
上添加一个简单的验证层
下面,在我的指令中:
this.var = SomeFactory.getData()
.then(function(response) {
//some variable = response;
})
.catch(function(response) {
//Do error handling here
});
现在据我了解,这是一种反模式。因为最初的延迟 promise 捕获了错误并简单地吞掉了它。它不会返回错误,因此当调用此“getData”方法时,我必须执行另一个 catch 来捕获错误。
如果这不是反模式,那么有人可以解释为什么两者都需要某种“回调”吗?当我第一次开始编写这个工厂/指令时,我预计必须在某处执行延迟 promise ,但我没有预料到双方都必须 .catch()
(也就是说,我有点认为我可以如果我执行了 SomeFactory.getData()
最佳答案
Is this a “Deferred Antipattern”?
是的,确实如此。 当创建一个新的冗余延迟对象并从 promise 链内部解析时,就会发生“延迟反模式”。在您的情况下,您使用 $q 来返回隐式返回 promise 的 promise 。你已经有一个 Promise 对象($http service
本身返回一个 promise
),所以你只需要返回它即可!
这是一个 super 简单的示例,展示了具有延迟 promise 和反模式的服务的外观,
This is anti-pattern
app.factory("SomeFactory",['$http','$q']){ return { getData: function(){ var deferred = $q.defer(); $http.get(destinationFactory.url) .then(function (response) { deferred.resolve(response.data); }) .catch(function (error) { deferred.reject(error); }); return deferred.promise; } } }])
这就是你应该做的
app.factory("SomeFactory",['$http']){
return {
getData: function(){
//$http itself returns a promise
return $http.get(destinationFactory.url);
}
}
两者的消耗方式相同。
this.var = SomeFactory.getData()
.then(function(response) {
//some variable = response;
},function(response) {
//Do error handling here
});
这两个例子都没有问题(至少在语法上)..但是第一个是多余的..并且不需要!
希望有帮助:)
关于angularjs - 这是 "Deferred Antipattern"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30750207/