gpt4 book ai didi

angularjs - 这是 "Deferred Antipattern"吗?

转载 作者:行者123 更新时间:2023-12-03 06:41:06 25 4
gpt4 key购买 nike

我发现很难理解“延迟反模式”。我想我原则上理解它,但我还没有看到一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com