我觉得这是一个非常糟糕的主意,因为我没有在任何地方找到它,但在我的localhost上测试它似乎工作。我有服务:
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子句。它对于代码组织也很有用,在服务成功之后我做的常见事情是在服务中,而特定的东西在控制器中。问题是,我觉得这非常不符合任何文档或示例。我没有真正找到它,我错误地发现了它。它在某些情况下也可能不起作用?
我也知道其他选项,$ q库并且可以在服务中进行deffer,但最终会有更多的代码。
那么,这是一个坏主意,为什么?任何意见都会非常有帮助。我不想设置错误的做法。
答案 0 :(得分:2)
因此,如您所知,使用承诺被认为是一种很好的做法。为此,您只需将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()
是完全正常的,并且可以按预期工作。
答案 1 :(得分:1)
这不一定是个坏主意,只是你使用了承诺的链接。
.then
函数如下所示:
.then(function(success){}, function(error){});
你可以看到.success
只是上面第一个函数的简写(好像你没有声明错误回调)。
看到承诺可以传递或者您可能有多个服务发出相同的请求而您只想创建一个承诺,那么您可能希望从多个区域声明回调但只有一个承诺解决。
这是一个坏主意吗?没有为什么?它是一段灵活的代码,非常适合程序员使用。你能宣布多个天堂吗?是。你应该把它与成功的回调混合起来吗?你可以,但你可能只想坚持一种风格以保持一致性。但那真的取决于你想要实现的目标。
Angular文档:https://docs.angularjs.org/api/ng/service/ $ http
(注意弃用,可能只想坚持.then)