如何处理angularjs工厂服务中的$http异步问题?

How to handle $http asynchronous issues in angularjs factory service?

本文关键字:http 异步 问题 服务 工厂 何处理 处理 angularjs      更新时间:2023-09-26

在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

工厂内的$http.get()返回数据

重构提示:您可以构建一个通用的rest服务工厂,然后为每种类型的调用实现它,而不是构建一个充满switch-case:s的"包住一切"的rest服务。每个类型的rest调用有一个方法。然后调用RestService.getAllClients而不是DashboardFactory.restService,它根据上面的方法设置数据或返回一个promise。

Switch-case只是对特性选择不好,你隐藏了功能,使代码容易出现隐藏错误。