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

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


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

希望能帮助到你 :)

关于angularjs - 这是“延迟反模式”吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30750207/

10-11 04:27