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

时间:2015-09-02 21:27:47

标签: javascript angularjs http web

在工厂服务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”。

我该怎么办?

提前致谢!

2 个答案:

答案 0 :(得分:0)

teststatus设置为“bbb”,并在API调用完成之前返回,因为调用是异步的。

有关从API调用中返回数据的不同方法,请参阅AngularJS $http call in a Service, return resolved data, not promises

您要做的是在teststatus / .success()函数的末尾而不是在外面返回.error()。这样,它只在完成API调用后返回,并将其设置为调用返回的数据。

答案 1 :(得分:0)

方法1:您根本不需要退货。您可以将模型发送到服务RestService.getAllClients = function(myModel),在成功myModel.AllClients = data;上设置模型上的属性,然后使用{{myModel.AllClients}}显示该属性。直接在传入的模型中设置属性将自动更新绑定。

示例:http://jsbin.com/muxijozofa/edit?html,js,output

方法2:否则您需要返回整个get调用,这将返回promise,然后您需要在控制器上解析根据fe How do I return data from a $http.get() inside a factory in angularjs

重构提示:您可以构建一个通用的休息服务工厂,然后为每种类型的呼叫实施,而不是构建一个充满了switch-case:s的“全能”休息服务。因此,每种类型的休息呼叫都会获得一种方法。而不是DashboardFactory.restService,您将调用RestService.getAllClients,它根据上述方法设置数据或返回承诺。

Switch-case对功能选择不利,你隐藏了功能并使代码容易出现隐藏错误。