Javascript 为什么来自Promise的回调是反模式的呢
我看到了StackOverflow的答案,人们建议为AngularJS服务提供回调函数Javascript 为什么来自Promise的回调是反模式的呢,javascript,angularjs,angular-promise,anti-patterns,Javascript,Angularjs,Angular Promise,Anti Patterns,我看到了StackOverflow的答案,人们建议为AngularJS服务提供回调函数 app.controller('tokenCtrl', function($scope, tokenService) { tokenService.getTokens(function callbackFn(tokens) { $scope.tokens = tokens; }); }); app.factory('tokenService', function($http)
app.controller('tokenCtrl', function($scope, tokenService) {
tokenService.getTokens(function callbackFn(tokens) {
$scope.tokens = tokens;
});
});
app.factory('tokenService', function($http) {
var getTokens = function(callbackFn) {
$http.get('/api/tokens').then (function onFulfilled(response) {
callbackFn(response.data);
});
};
return {
getTokens: getTokens
};
});
在我看来,这似乎是一种反模式。$http
服务返回承诺并拥有。然后方法执行回调函数感觉像是一种不健康的控制反转
一个人如何重新考虑像这样的代码,如何解释为什么原来的方法不是一个好主意
var getTokens = function() {
return $http.get('/api/tokens');
};
然后在其他模块中使用
yourModule.getTokens()
.then(function(response) {
// handle it
});
至于为什么它是反模式,我想说,首先,它不允许您进一步链接成功/失败处理程序方法。其次,它处理处理处理从调用方模块到被调用模块的响应的控制(这在这里可能不是非常重要,但它仍然施加相同的控制反转)。最后,您将承诺的概念添加到您的代码库中,这对于某些队友来说可能不太容易理解,但随后将承诺用作回调,因此这真的毫无意义。代码可以按如下方式重新分解:
app.controller('tokenCtrl', function($scope, tokenService) {
tokenService.getTokens.then ( callbackFn(tokens) {
$scope.tokens = tokens;
});
});
app.factory('tokenService', function($http) {
var getTokens = function() {
//return promise
return $http.get('/api/tokens').then (function onFulfilled(response) {
//return tokens
return response.data;
}
);
};
return {
getTokens: getTokens
};
});
通过让服务返回承诺,并使用承诺的.then
方法,可以通过以下好处实现相同的功能:
- 承诺可以保存并用于链接
- 承诺可以保存并用于避免重复相同的
$http
调用
- 错误信息会被保留,可以使用
.catch
方法检索
- 承诺可以转发给其他客户
告诉人们实际使用承诺,而不是忽略承诺。我发现使用promise
有点健康,因为它能够链接承诺并控制异步调用。主要问题是then()
中没有返回任何内容,回调中就没有地方可以捕捉错误。它打破了承诺链使用承诺会使代码更短、更简单。此服务返回对象没有多大意义。。。它需要返回一个承诺,以便任何使用它的人都能知道数据何时准备好。