如何处理angularjs工厂服务中的$http异步问题?
How to handle $http asynchronous issues in angularjs factory service?
在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;
}).error(function(error) {
teststatus = 'Unable to load the client data: ' + error.message;
});
teststatus = "bbb";
break;
}
return teststatus;
};
在控制器中,代码是这样的:
$scope.AllClients=DashboardFactory.restService("getAll","","");
我还将"AllClients"放在html页面上以监视结果:
{{AllClients}}
我认为"AllClients"应该显示来自远程服务器的API数据。但实际上它总是给我"bbb"。
我该怎么办?
提前感谢!
teststatus
被设置为"bbb",并且在API调用完成之前返回,因为调用是异步的。
参考AngularJS在Service中的$http调用,返回解析后的数据,而不是承诺,以不同的方式从API调用中返回数据。
您要做的是在
.success()
/.error()
函数结束时返回teststatus
,而不是在外面。这样,它只在完成API调用后返回,并将其设置为调用返回的数据。
方法1:您根本不需要返回它。您可以将模型发送到服务RestService.getAllClients = function(myModel)
,在成功的myModel.AllClients = data;
上设置模型的属性,然后使用{{myModel.AllClients}}
显示它。直接在传入模型上设置属性将自动更新绑定。
示例:http://jsbin.com/muxijozofa/edit?html、js、输出
方法2:否则你需要返回整个get
调用,这将返回一个promise
,然后你需要在控制器上解析,按照f.e我如何从angularjs
重构提示:您可以构建一个通用的rest服务工厂,然后为每种类型的调用实现它,而不是构建一个充满switch-case:s的"包住一切"的rest服务。每个类型的rest调用有一个方法。然后调用RestService.getAllClients
而不是DashboardFactory.restService
,它根据上面的方法设置数据或返回一个promise。
Switch-case只是对特性选择不好,你隐藏了功能,使代码容易出现隐藏错误。
- 角度异步http自动完成
- 如果需要登录,Angularjs$http拦截器会暂停异步请求
- 从 Ajax 获取由 ZombieJS 的异步点击事件触发的 Http 错误
- 如何在Angular中设置异步HTTP服务的回调,以便在不定义数组的情况下在控制器中填充数组
- 异步HTTP(ajax)请求在脚本标记中有效,但在js文件中无效
- 异步http请求服务
- 如何使用 ajax 或 jquery 读取异步 HTTP (servlet3.0) 响应
- 如何在 Node.js 中的 HTTP 请求后异步导出 JSON 数组
- AngularJS:异步 $http.get 调用导致 View 出现问题
- 如何异步加载 http://debug.build.phonegap.com
- 尝试使用 Angular $http通过表单异步提交文件
- 力量角器's on准备等待异步http请求
- SuiteScript;用户事件脚本中的异步HTTP请求
- 与$http和$resource异步$cacheFactory
- 在没有外部库的情况下,在Node中处理多个异步http请求的正确方法是什么?
- 在Node.js中对sqlite数据库进行异步http请求
- 如何使用$q异步返回http请求的值(使用typescript)
- 如何处理angularjs工厂服务中的$http异步问题?
- 在http post AngularJS异步中使用循环
- 我如何在Javascript中进行异步HTTP请求