Javascript 如何处理angularjs工厂服务中的$http异步问题?;
在factory service js文件中,我创建了如下服务:Javascript 如何处理angularjs工厂服务中的$http异步问题?;,javascript,angularjs,http,web,Javascript,Angularjs,Http,Web,在factory service js文件中,我创建了如下服务: DashboardFactory.restService = function(method) { var teststatus = "aaa"; switch (method) { case "getAll": $http.get($_REST_API_ROOT_URL + "clients").success(function(data) { teststatus = data; }).er
DashboardFactory.restService = function(method) {
var teststatus = "aaa";
switch (method) {
case "getAll":
$http.get($_REST_API_ROOT_URL + "clients").success(function(data) {
teststatus = data;
}).error(function(error) {
teststatus = 'Unable to load the client data: ' + error.message;
});
teststatus = "bbb";
break;
}
return teststatus;
};
$scope.AllClients=DashboardFactory.restService("getAll","","");
在控制器中,代码如下所示:
DashboardFactory.restService = function(method) {
var teststatus = "aaa";
switch (method) {
case "getAll":
$http.get($_REST_API_ROOT_URL + "clients").success(function(data) {
teststatus = data;
}).error(function(error) {
teststatus = 'Unable to load the client data: ' + error.message;
});
teststatus = "bbb";
break;
}
return teststatus;
};
$scope.AllClients=DashboardFactory.restService("getAll","","");
我还将“AllClient”放在html页面上以监视结果:
{{AllClients}}
我认为“AllClient”应该显示来自远程服务器的API数据。但事实上,它总是给我“bbb”
我该怎么办
提前谢谢
teststatus
设置为“bbb”,并在API调用完成之前返回,因为调用是异步的
有关从API调用返回数据的不同方式,请参阅
您要做的是在
.success()
/.error()
函数结束时返回teststatus
,而不是在函数外部。这样,它只在完成API调用并将其设置为调用返回的数据后返回。方法1:您根本不需要返回它。您可以将模型发送到服务RestService.getAllClients=function(myModel)
,在模型成功时设置属性myModel.AllClients=data
然后用{{myModel.AllClients}}
显示它。直接在传入模型上设置属性将自动更新绑定
例如:
方法2:否则您需要返回整个get
调用,该调用将返回一个promise
,然后您需要根据f.e.在控制器上解决该问题
重构提示:您可以构建一个通用的rest服务工厂,然后为每种类型的调用实现该工厂,而不是构建一个充满switch case:s的“catch all”rest服务。因此,每种类型的rest调用都有一个方法。然后,您可以调用restService.getAllClients
,而不是DashboardFactory.restService
,它根据上述方法设置数据或返回承诺
Switch case不利于功能选择,您隐藏了功能,使代码容易隐藏错误。这正是我想要做的。那我怎么做呢?我对angularjs非常陌生。删除
返回teststatus代码>函数末尾的行。然后添加返回teststatus每次在success()
和error()
函数中指定teststatus
值后,都会执行code>操作。这将从success方法返回值,但不会从服务返回值。抱歉,我忽略了这一点。请参阅以从您的通话中返回数据。