为了账号安全,请及时绑定邮箱和手机立即绑定

这是“递延反模式”吗?

这是“递延反模式”吗?

守候你守候我 2019-06-05 16:03:26
这是“递延反模式”吗?我发现很难理解“延迟反模式”。我想我在原则上理解它,但我还没有看到一个非常简单的服务例子,有着不同的承诺和反模式,所以我想我会尝试做我自己的,但考虑到我对它的了解不是很好,我会首先得到一些澄清。我在一家工厂里有以下情况://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});现在对我来说,这是一个反模式。因为最初的延迟承诺捕获了错误并简单地吞噬了它。它不返回错误,所以当调用这个“getData”方法时,我必须执行另一个捕获来获取错误。如果这不是反模式,那么有人能解释为什么两者都需要某种“回调”吗?当我第一次开始写这个工厂/指令的时候,我预料到必须在某个地方履行一个不遵守的承诺,但我并没有预料到.catch()在双方(也就是我的意思是,我想我可以让工厂返回响应或错误,如果我做了SomeFactory.getData()
查看完整描述

3 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

这是“递延反模式”吗?

是的,是的。“延迟反模式”发生在创建一个新的冗余延迟对象以从承诺链内部解析时。..在您的情况下,您使用$q来返回某个隐含返回承诺的承诺。您已经有了一个承诺对象($http service本身返回promise所以你只需要把它还回去!

下面是一个非常简单的例子,它展示了服务的延迟承诺和反模式,

这是反模式

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});

这两个例子都没有什么问题(至少在语法上是这样).但是第一个例子是多余的,而不是必需的!

希望有帮助:)


查看完整回答
反对 回复 2019-06-05
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

我想说的是经典延迟反模式,因为您正在创建不必要的延迟对象。但是,您正在为链添加一些价值(通过验证)。通常情况下,当延迟对象被创建时,反模式是特别糟糕的。

所以,代码可能要简单得多。

$q承诺有一个文档化的特性,自动包装在承诺中返回的任何内容(使用$q.when)。在大多数情况下,这意味着您不必手动创建延迟:

var deferred = $q.defer();

但是,这就是文档如何演示如何使用$q.

因此,您可以将代码更改为:

return {
    getData: function(){
        return $http.get(destinationFactory.url)
            .then(function (response) {
                if (typeof response.data === 'object') {
                    return response.data;
                } else {
                    throw new Error('Error message here');
                }
            });

            // no need to catch and just re-throw
        });
    }


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 531 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号