当前位置: 首页 > 面试题库 >

这是“延迟反模式”吗?

子车飞鹏
2023-03-14
问题内容

我发现很难理解“延迟反模式”。我想我基本上理解了它,但是我还没有看到一个简单的例子,说明什么是服务,具有不同的承诺和一个具有反模式的服务,所以我想尽我所能,但是看到自己不是这样超级了解这一点,我会先澄清一下。

我在工厂(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
});

现在来看,这是一种反模式。因为原始的延迟承诺会捕获错误并直接吞下错误。它不会返回错误,因此在调用此“
getData”方法时,我需要执行另一个捕获操作以捕获错误。

如果这不是反模式,那么有人可以解释为什么两者都需要某种“回调”吗?当我刚开始编写此工厂/指令时,我曾期望必须在某个地方做一个有前途的承诺,但我没想到.catch()双方都必须这样做(也就是我有点想我可以让工厂返回响应或错误,如果我做了一个SomeFactory.getData()


问题答案:

这是“延迟反模式”吗?

是的。 当创建了一个新的冗余延迟对象以从promise链内部进行解析时,就会发生“延迟反模式” 。在您的情况下,您正在使用$
q为隐式返回承诺的内容返回承诺。您已经有一个Promise对象($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
});

这两个示例都没有错(至少在语法上)。但是第一个示例是多余的,并且不需要!

希望能帮助到你 :)



 类似资料:
  • 我发现很难理解“延迟反模式”。我想我基本上理解它,但我还没有见过一个超级简单的例子来说明什么是服务,有不同的promise和反模式,所以我想我会试着做我自己的,但鉴于我对它的了解不够,我会首先得到一些澄清。 在我看来,这是一种反模式。因为最初的延期promise抓住了错误,并简单地将其吞掉。它不会返回错误,所以当调用这个“getData”方法时,我必须执行另一个catch来获取错误。 如果这不是反

  • 问题内容: 我正在尝试使用新的React Lazy和Suspense创建后备加载组件。这很好用,但后备时间仅显示几毫秒。有没有办法增加额外的延迟或最短时间,因此我可以在渲染下一个组件之前显示该组件的动画? 现在懒导入 等待组件: 我可以做这样的事情吗? 问题答案: 函数应该返回对象的承诺,该对象由具有默认导出功能的模块返回。不会返回承诺,也不能那样使用。尽管任意承诺可以: 如果目标是提供 最小的

  • 主要内容:SDF 文件,实例,实例,实例关键词: 延迟反标注, SDF 延迟反标注是设计者根据单元库工艺、门级网表、版图中的电容电阻等信息,借助数字设计工具将延迟信息标注到门级网表中的过程。利用延迟反标注后的网表,就可以进行精确的时序仿真,使仿真更接近实际工作的数字电路。 延迟反标注过程 前面教程中的仿真基本都是功能性的仿真。无论是进行 IC 设计还是 FPGA 开发,时序仿真都是必不可少的。《Verilog 教程》的《1.4 Veri

  • 主要内容:实例,实例,实例,实例关键词: 分布延迟, 集总延迟, 路径延迟 之前大部分仿真都是验证数字电路功能的正确性,信号传输都是理想的,没有延迟。但是实际逻辑元器件和它们之间的传输路径都会存在延迟。因此,必须检查设计中的延迟是否满足实际电路的时序约束要求。可以用时序仿真的方法来检查时序(timing),即在仿真时向元件或路径中加入和实际相符的延迟信息,并进行相关计算来确定时序是否满足。 静态时序分析 (Static Timi

  • 为了显示这种关系,让我们开始定义一个简单的模块,作为我们的示例应用程序的根模块。 app/app.module.ts 到目前为止,这是一个非常常见的模块,依赖于,有一个路由机制和两个组件:AppComponent和EagerComponent。 现在,让我们专注于定义导航的应用程序(AppComponent)的根组件。 app/app.component.ts import { Component

  • 最近我读了Mark Seemann关于Service Locator反模式的文章。 作者指出ServiceLocator是反模式的两个主要原因: > API使用问题(我对此很满意) 当类使用服务定位器时,很难看到它的依赖关系,因为在大多数情况下,类只有一个PARAMETERLESS构造函数。与ServiceLocator不同,DI方法通过构造函数的参数显式地公开依赖项,所以在IntelliSens