Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何干燥http成功和错误函数?_Javascript_Jquery_Angularjs - Fatal编程技术网

Javascript 如何干燥http成功和错误函数?

Javascript 如何干燥http成功和错误函数?,javascript,jquery,angularjs,Javascript,Jquery,Angularjs,假设我的应用程序中有超过100个请求。编写尽可能多的成功和错误函数来处理响应,既麻烦又耗时 目前我确实喜欢这样: angular .module('mahanApp') .service('HttpService',函数($http){ //全名 函数getNames(){ 返回$http.get('/data/names/')) } 返回{ getNames:getNames } .controller('NameController',函数NameController( HttpServi

假设我的应用程序中有超过100个请求。编写尽可能多的
成功
错误
函数来处理
响应
,既麻烦又耗时

目前我确实喜欢这样:

angular
.module('mahanApp')
.service('HttpService',函数($http){
//全名
函数getNames(){
返回$http.get('/data/names/'))
}
返回{
getNames:getNames
}
.controller('NameController',函数NameController(
HttpService){
var ctrl=this;
//获取所有模板名称;
HttpService.getNames()。然后(
功能成功(响应){
ctrl.names=response.data;
},
函数错误(响应){};
})

});我将尝试总结讨论内容和一些消除重复的方法:

首先,第二种方法是在控制器中重新使用函数的正确方向

经典的方法是:

return {
  getNames: getNames
}
.controller('NameController', function NameController(
  HttpService) {
  var ctrl = this;
  HttpService.getNames().then(function(res) { ctrl.names = res; } );
})
请注意,如果您的所有呼叫都采用相同的格式,则您甚至可以提取更多信息,例如,您可以:

// utility function that loads something into your controller
var load = function(request, ctrl, prop) {
    request.then(function(res) { ctrl[prop] = res; } 
};

// this way you can have many of requests with minimal code
load(HttpService.getNames, ctrl, 'names');
load(HttpService.getBooks, ctrl, 'books');
load(HttpService.getThings, ctrl, 'things');
...
或者,如果您可以在项目中使用ES2017(例如,您的代码被传输),您可以简化一些新功能的使用,而无需额外的功能:

// Using promise all will assure these are all fetched asynchronously in respect to one another
Promise.all([
    async () => ctrl.names = await HttpService.getNames(),
    async () => ctrl.books = await HttpService.getBooks(),
    async () => ctrl.things = await HttpService.getThings()
]);
最后,您可能真的希望参数化您的请求,以便只有一个:

// Get all
function getAll(what) {
  return $http.get('/data/' + what).then(success, error)
}
然后,您不需要为每种类型使用不同的方法,只需执行以下操作:

getAll('names');
getAll('books');
...

第二种方法是正确的-只需在
NameController
中使用
HttpService.getNames()
-如果这样做会出现什么问题/错误?
mahanService.getNames()
将返回一个承诺。。您需要解析将其分配给变量的承诺。@OvidiuDolha Ok。我使用了
ctrl.names=httpService.getNames()
。但是
ctrl.names
undefined
。如果您的承诺是挂起的(尚未解决),我认为您只需要调用.then(function(result){}之后,这样您就可以分配承诺的结果,而不是承诺本身
HttpService.getNames()
将返回一个承诺,您需要调用
HttpService.getNames()。然后在控制器中(res=>myVar=res)