AngularJs承诺:你可以同时使用success和then

AngularJs promises: can you use both success and then?

本文关键字:success then 承诺 AngularJs      更新时间:2023-09-26

我觉得这是一个非常糟糕的主意,因为我没有在任何地方找到它,但在我的本地主机上测试它似乎可以工作。我有一个服务:

angular
    .module('trips.services')
    .service('Trip', Trip);
function Trip($http, $q) {
    //.....
    function create(data) {
        var api_url = "/api/trip";
        return $http.post(api_url, data).success(function(data) {
            mixpanel.track("Trip: created", {}); // track that a new event happened
        });
    }
}

我也有一个控制器,我做一些像:

Trip.create(data).success(function(data) {
    //do something after the trip is created
})
现在你可以在这个例子中看到,我在服务中同时使用了then promisesuccess回调。如果我在调试器中设置断点,则首先执行来自服务的成功回调,然后执行来自控制器的then子句。这对于代码组织也很好,服务成功后我做的常见的事情是在服务中,而特定的事情是在控制器中。问题是,我觉得这是非常不符合任何文件或例子。其实不是在什么地方找到的,我是不小心发现的。在某些情况下也可能不起作用?

我也知道其他的选择,$q库和可以在服务中有所不同,但最终会产生更多的代码。

那么,这是一个坏主意吗?为什么?任何意见都会很有帮助。我不想树立一个错误的做法。

因此使用promise被认为是一种很好的实践,正如您已经知道的那样。为此,您可以简单地将success -回调替换为另一个then:

function create(data) {
    var api_url = "/api/trip";
    var promise = $http.post(api_url, data);
    promise.then(function(data) {
        mixpanel.track("Trip: created", {}); // track that a new event happened
    });
    return promise;
}

在一个承诺上有多个独立的.then()是完全好的,并且如您所期望的那样工作。

这并不是一个坏主意,只是你使用了承诺链。

.then函数如下所示:

.then(function(success){}, function(error){});

可以看到,.success只是上面第一个函数的简写(就好像没有声明错误回调一样)。

考虑到承诺可以被传递,或者你可能有多个服务发出相同的请求,而你只想创建一个承诺,那么你可能想要从多个区域声明回调,但只有一个承诺被解析。

所以这是个坏主意吗?不。为什么?这是一段灵活的代码,完全取决于程序员如何使用。你能声明多个吗?是的。你应该把它和成功回调混合在一起吗?你可以,但是为了保持一致性,你可能只想坚持一种风格。但这真的取决于你想要达到的目标。

Angular文档:https://docs.angularjs.org/api/ng/service/$http
(注意弃用,可能只想坚持使用。then)